@ एलेजेंड्रो ने सर्वश्रेष्ठ XPath 1.0 उत्तर प्रदान किया, जो वर्षों से ज्ञात है, first used by Jeni Tennison लगभग दस साल पहले।
इस अभिव्यक्ति के साथ एकमात्र समस्या इसकी चमकदार लालित्य है, जो न केवल नौसिखिया प्रोग्रामर द्वारा समझना मुश्किल बनाता है।
एक की मेजबानी की XPath 1.0 (और हर XPath होस्ट किया गया है!) एक और समझा जा सकता भाव उपयोग कर सकते हैं:
string((/Foo/Baz | $vDefaults[not(/Foo/Baz/text())]/Foo/Baz)[last())
यहाँ चर $vDefaults
एक अलग दस्तावेज़ प्राथमिक XML के रूप में एक ही संरचना है कि है दस्तावेज़, और जिनके टेक्स्ट नोड्स में डिफ़ॉल्ट मान होते हैं।
या, यदि XSLT होस्टिंग भाषा है, एक document()
समारोह उपयोग कर सकते हैं:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output method="text"/>
<my:defaults>
<Foo>
<Bar/>
<Baz>not-found</Baz>
</Foo>
</my:defaults>
<xsl:template match="/">
<xsl:value-of select=
"concat(/Foo/Baz,
document('')[not(current()/Foo/Baz/text())]
/*/my:defaults/Foo/Baz
)"/>
</xsl:template>
</xsl:stylesheet>
या, concat()
का उपयोग नहीं:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output method="text"/>
<my:defaults>
<Foo>
<Bar/>
<Baz>not-found</Baz>
</Foo>
</my:defaults>
<xsl:variable name="vDefaults" select="document('')/*/my:defaults"/>
<xsl:template match="/">
<xsl:value-of select=
"(/Foo/Baz
| $vDefaults/Foo/Baz[not(current()/Foo/Baz/text())]
)
[last()]"/>
</xsl:template>
</xsl:stylesheet>
स्रोत
2010-12-20 15:53:48
+1 अच्छा उत्तर। –
चालाक; अच्छा काम-आसपास :) –
यह वास्तव में अनजान XPath है, और जब मेरी असली दुनिया XPath को नोड को प्रतिस्थापित किया जाता है तो यह वास्तव में बदसूरत XPath भी है। लेकिन इसे आप को सौंपना है, यह वास्तव में चालाक है। –