我无法正确地制定它,更好的例子。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar id="someId" class="someClass"/>
<buz class="someClass" id="someId"/>
<ololo class="someClass"/>
<test id="someId"/>
</foo>
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*/*">
<xsl:value-of select="@id | @class"/><xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
结果:
someId
someClass
someClass
someId
我需要什么
我需要保留属性的“优先级”,如我的xpath表达式中所述。
因此,如果我们调用@id | @class
一个带有两个操作数的表达式,我需要不按文档顺序获取属性,而是按照表达式中指定两个操作数的顺序。
因此,结果应为:
someId
someId
someClass
someId
@class
只有在@id
不存在的情况下才能进行。
我知道,它可以通过条件逻辑来完成,但我真的对一个简短的解决方案感兴趣,因为它很常见,并用作属性值模板。
这可能是显而易见的,我想念The Elegant One。
请注意我说的是 XPath 1.0 。
答案 0 :(得分:3)
使用强>:
@id | @class[not(../@id)]
此XPath表达式始终选择一个节点:@id
(如果存在),且仅当@id
不存在时才@class
。
所以转型:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="foo/*">
<xsl:value-of select="@id | @class[not(../@id)]"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<foo>
<bar id="someId" class="someClass"/>
<buz class="someClass" id="someId"/>
<ololo class="someClass"/>
<test id="someId"/>
</foo>
生成想要的正确结果:
someId
someId
someClass
someId