获取XML值的XSLT文件路径

时间:2016-01-07 13:19:37

标签: xml xslt

有没有办法可以避免使用完整路径获取下面显示的XSLT文档中的值?我试图编辑xsl:模板匹配但无法编辑。

<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="Username" value="{/samlp:Response/saml:Assertion/saml:AttributeStatement/saml:Attribute/saml:AttributeValue[../@Name = 'UserName']}"/>
        </USERINFO>
    </AUTHENTICATOR>
</xsl:template>
</xsl:stylesheet>

示例XML代码段:

<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
             Destination="https://login.com/Login/Authentication.aspx?configSet=SAML"
             ID="_5ed24fbfdeb20b1d0f98ed3d87f75dd8"
             IssueInstant="2015-10-26T18:19:38.218Z"
             Version="2.0"
             >
<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
                 ID="_924982879ed0ee46ad33e21e674b2a65"
                 IssueInstant="2015-10-26T18:19:38.218Z"
                 Version="2.0"
                 xmlns:xs="http://www.w3.org/2001/XMLSchema"
                 >
    <saml2:AttributeStatement>
        <saml2:Attribute Name="UserName"
                         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"
                                  >User@email.com</saml2:AttributeValue>
        </saml2:Attribute>
    </saml2:AttributeStatement>
</saml2:Assertion>
</saml2p:Response>

1 个答案:

答案 0 :(得分:0)

你可以把你的表达写成......

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

请注意@Name上的条件实际上可能违反此处的saml:Attribute元素,而不是针对../@Name执行saml:AttributeValue

或者,如果确保XML中始终存在用户名,您也可以这样做......

<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="saml:Attribute[@Name = 'UserName']">
    <AUTHENTICATOR>
        <USERINFO>
            <field name="Username" value="{saml:AttributeValue}"/>
        </USERINFO>
    </AUTHENTICATOR>
</xsl:template>

<xsl:template match="text()" />

</xsl:stylesheet>

匹配text()的模板是忽略XML中可能出现的任何其他AttributeValue元素的文本。