来自传入的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>
答案 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() < last()">,</xsl:if>
</xsl:template>
(条件确保相邻值之间只有逗号,没有孤立逗号。)