创建一个连接唯一子元素值的 XSLT 变量

Create a XSLT variable concatenating unique child element values

这是我的 XML

<?xml version='1.0'?>
<root>
    <elems>
        <status>Completed</status>
        <description>Records</description>
        <sub_type>SEC</sub_type>
        <type>FIR</type>
        <result>Done</result>
    </elems>
    <elems>
        <status>Completed</status>
        <description>Records</description>
        <sub_type>SEC</sub_type>
        <type>FIR</type>
        <result>Done</result>
    </elems>
    <elems>
        <status>Completed</status>
        <description>Morals</description>
        <sub_type>GIX</sub_type>
        <type>PANC</type>
        <result>Done</result>
    </elems>
    <elems>
        <status>Completed</status>
        <description>Morals</description>
        <sub_type>GIX</sub_type>
        <type>PANC</type>
        <result>Done</result>
    </elems>
    <elems>
        <status>Completed</status>
        <description>Checking</description>
        <type>SSO</type>
        <result>Done</result>
    </elems>
</root>

我想要一个变量,它应该通过连接 typesub_type 元素来提供唯一值(因为 elems 元素是重复和重复的元素),如下所示。 sub_type 可以是空元素。对于我下面的例子,变量名可以是 vars..

FIRSEC PANCGIX SSO 

然后我应该可以使用这个 $var

foreach
<root>
   <xsl:for-each select="$vars">
       <inner><xsl:value-of select="." /></inner>
    </xsl:for-each>
<root>

它应该打印

<root>
   <inner>FIRSEC</inner>
   <inner>PANCGIX</inner>
   <inner>SSO</inner>
</root>

在 XSLT 2.0 中,使用 distinct-values() 函数非常简单:

<xsl:variable name="vars" select="distinct-values(/root/elems/concat(type,sub_type))"/>

注意这个变量是多余的,因为你可以直接做:

<root>
   <xsl:for-each select="distinct-values(/root/elems/concat(type,sub_type))">
       <inner>
           <xsl:value-of select="." />
        </inner>
    </xsl:for-each>
</root>