1

我正在使用 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#

有可能实现吗?

4

1 回答 1

1

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

distinct-values(
    for $prop in properties/property
    return if ($prop/@aaa != '') then $prop/@aaa else $prop
)
于 2013-05-15T13:27:21.900 回答