在可用时获取属性,否则为元素

时间:2013-05-15 12:56:07

标签: xml xslt

我正在使用XSLT处理XML文件,我希望获得具有以下属性的每个项目的属性列表:

  • 如果设置了属性 aaa ,请获取属性
  • 的值
  • 如果未设置属性 aaa ,请取元素值
  • 从结果集中,仅采用不同的值

这是一个示例XML

<items>
    <item>
        <properties>
            <property aaa="">pA</property>
            <property aaa="pB">pC</property>
            <property aaa="pA">pA</property>
        </properties>
    </item>
    <item>
        <properties>
            <property aaa="">pD</property>
            <property aaa="pE">pF</property>
        </properties>
    </item>
</items>

现在这就是我试图实现它的方式:

<xsl:for-each select="/items/item">
    <xsl:for-each select="distinct-values(properties/property/@aaa | properties/property)[not(. = '')]"><xsl:value-of select="."/>#</xsl:for-each>
</xsl:for-each>

属性 aaa 总是在那里,有时它是空的。我遇到的问题是,如果属性和元素都设置了,它们都会出现在集合中。我只希望出现该属性。所以对于上面的XML,正确的解决方案是

pA#pB#
pD#pE#

我的代码给了我的是

pA#pB#pC#
pD#pE#pF#

有可能实现吗?

1 个答案:

答案 0 :(得分:1)

您使用distinct-values的事实表明您正在使用XSLT 2.0,因此您可以结合使用XPath 2.0 forif构造:

distinct-values(
    for $prop in properties/property
    return if ($prop/@aaa != '') then $prop/@aaa else $prop
)