XSLT创建逗号分隔列表

时间:2016-02-09 15:02:03

标签: xml xslt

来自传入的SAML响应:

<saml2:Attribute Name="FirstName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Joe</saml2:AttributeValue>
</saml2:Attribute>

代码来自XSLT转换文件:

<field name="FirstName" value="{//saml:Attribute[@Name='FirstName']/saml:AttributeValue}"/>

生成此输出:

<field name="FirstName" value="Joe"/> 

这是正常的。但是一个指定的节点可以有多个值,例如:

<saml2:Attribute Name="FirstName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Joe</saml2:AttributeValue>
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Suzy</saml2:AttributeValue>
</saml2:Attribute>

我需要输出:

<field name="FirstName" value="Joe,Suzy"/> 

我需要在变换文件中更改以获得所需的输出?

更新

我现在可以使用来自“小甜蜜”的建议获得以下输出,但我似乎无法让逗号分隔符工作。不确定将其添加到文档中的哪个位置?

<field name="FirstName" value="JoeSuzy"/> 

以下是完整的XSLT文件供参考:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<xsl:template match="/">
    <AUTHENTICATOR>
        <USERINFO>
                <field name="FirstName">
                    <xsl:attribute name="value">
                        <xsl:apply-templates select="//saml:Attribute[@Name='FirstName']/saml:AttributeValue"></xsl:apply-templates>
                    </xsl:attribute>
                </field>    
        </USERINFO>
    </AUTHENTICATOR>
</xsl:template>
</xsl:stylesheet> 

1 个答案:

答案 0 :(得分:0)

我会像这样重写你的字段制作模板:

<field name="FirstName">
    <xsl:attribute name="value">
        <xsl:apply-templates select="saml2:Attribute[@Name='FirstName']/saml2:AttributeValue"></xsl:apply-templates>
    </xsl:attribute>
</field>

然后添加一个新模板以匹配属性值:

<xsl:template match="saml2:AttributeValue">
<xsl:value-of select="."/><xsl:if test="position() &lt; last()">,</xsl:if>
</xsl:template>

(条件确保相邻值之间只有逗号,没有孤立逗号。)