在单线程Xpath 1.0中保留操作数的优先级

时间:2011-01-08 00:27:09

标签: xslt xpath

我无法正确地制定它,更好的例子。

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>&#xa;</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

1 个答案:

答案 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>&#xA;</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