我需要修改现有的XML文档以连接到字段值。我不知道该怎么做,因为我无法将变量保留在范围内。
基本上,如果FirstName和LastName存在值,则应输出FirstName + LastName。如果FirstName或LastName中的任何一个或两个值都为空,则不应输出FullName。请注意,这是一个现有文档,我无法修改第34行以上的任何现有代码。
这是我到目前为止所做的:
<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:ds="http://www.w3.org/2000/09/xmldsig#">
<xsl:template match="/">
<AUTHENTICATOR>
<USERINFO>
<xsl:for-each select="/samlp:Response/*[local-name() = 'Assertion']/*[local-name() = 'AttributeStatement']/*">
<xsl:if test="@Name='First_Name'">
<xsl:variable name="firstname" select="*[local-name() = 'AttributeValue']" />
<xsl:element name="field">
<xsl:attribute name="name">FirstName</xsl:attribute>
<xsl:attribute name="value">
<xsl:for-each select="*[local-name() = 'AttributeValue']">
<xsl:value-of select="normalize-space(current())"/>
</xsl:for-each>
</xsl:attribute>
</xsl:element>
</xsl:if>
<xsl:if test="@Name='Last_Name'">
<xsl:variable name="lastname" select="*[local-name() = 'AttributeValue']" />
<xsl:element name="field">
<xsl:attribute name="name">LastName</xsl:attribute>
<xsl:attribute name="value">
<xsl:for-each select="*[local-name() = 'AttributeValue']">
<xsl:value-of select="normalize-space(current())"/>
</xsl:for-each>
</xsl:attribute>
</xsl:element>
</xsl:if>
<!-- Unable to modify anything above this line-->
<!-- if firstname & lastname not null, concatinate firstname + lastname-->
<xsl:if test="not($firstname = '') or not($lastname = '')">
<xsl:element name="field">
<xsl:attribute name="name">FullName</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="concat($firstname,'+',$lastname)" />
</xsl:attribute>
</xsl:element>
</xsl:if>
</xsl:for-each>
</USERINFO>
</AUTHENTICATOR>
</xsl:template>
</xsl:stylesheet>
以下简化的XML文件:
<samlp:Response ID="_f9daea33-e32a-4dde-beb4-d5227690b1a3" Version="2.0" IssueInstant="2015-07-30T15:06:58.874Z" Destination="https://domain.net/Login/PAuthentication.aspx?configSet=SAML" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">urn:jh:identityprovider</saml:Issuer>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
</samlp:Status>
<saml:Assertion Version="2.0" ID="_b54ca592-4401-4107-a426-281918091842" IssueInstant="2015-07-30T15:06:58.898Z" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<saml:AttributeStatement>
<saml:Attribute Name="FirstName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml:AttributeValue>John</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
<saml:AttributeStatement>
<saml:Attribute Name="LastName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml:AttributeValue>Doe</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
答案 0 :(得分:1)
这个例子相当令人困惑 - 目前还不清楚什么是“记录”以及你可以拥有多少条记录(根据你的XSLT判断,只有一条?)。
看看你是否可以将它作为起点。假设每个saml:Assertion
都是一条记录,如果记录同时包含FirstName和LastName,它会输出FullName
字段。
XSLT 1.0
<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"
exclude-result-prefixes="samlp saml">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/samlp:Response">
<AUTHENTICATOR>
<xsl:for-each select="saml:Assertion">
<USERINFO>
<xsl:variable name="firstname" select="saml:AttributeStatement/saml:Attribute[@Name='FirstName']/saml:AttributeValue"/>
<xsl:variable name="lastname" select="saml:AttributeStatement/saml:Attribute[@Name='LastName']/saml:AttributeValue"/>
<xsl:if test="$firstname and $lastname">
<field name="FullName" value="{concat($firstname, ' ', $lastname)}"/>
</xsl:if>
</USERINFO>
</xsl:for-each>
</AUTHENTICATOR>
</xsl:template>
</xsl:stylesheet>
测试输入
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<saml:AttributeStatement>
<saml:Attribute Name="FirstName">
<saml:AttributeValue>John</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
<saml:AttributeStatement>
<saml:Attribute Name="LastName">
<saml:AttributeValue>Doe</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<saml:AttributeStatement>
<saml:Attribute Name="FirstName">
<saml:AttributeValue>Madonna</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
</samlp:Response>
<强>结果强>
<?xml version="1.0" encoding="UTF-8"?>
<AUTHENTICATOR>
<USERINFO>
<field name="FullName" value="John Doe"/>
</USERINFO>
<USERINFO/>
</AUTHENTICATOR>
请注意使用前缀来调出源XML中的元素。