输入 - 输出转换删除节点并更新节点

时间:2017-10-12 11:15:02

标签: xslt xslt-1.0

如何将给定的输入xml转换为输出,如下所示。 应通过完全删除wsse:Security标头来转换输入xml,并且必须使用Username节点值更新EventUser值。 我试过下面的xlst。它无法正常工作

XLST -

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="EventUser">
        <xsl:copy>
            <xsl:value-of select="Username"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输入 -

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
      <wsse:Security mustUnderstandValue="1"
                     xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <wsse:UsernameToken id="UsernameToken-274">
            <wsse:Username>MyUsername</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>
         </wsse:UsernameToken>
      </wsse:Security>
   </soapenv:Header>
   <soapenv:Body>
      <axis2ns682:Create xmlns:axis2ns682="http://g22.test01.org/test02/RF">
         <tns:CreateDetails xmlns:tns="http://g22.test01.org/test02/RF">
            <tns:EventUser>Event</tns:EventUser>
            <tns:PreApprovedTemplateID>221398</tns:PreApprovedTemplateID>
            <tns:Priority>High</tns:Priority>
            <tns:PlannedImplementation_Start>2017-09-29</tns:PlannedImplementation_Start>
         </tns:CreateDetails>
      </axis2ns682:Create>
   </soapenv:Body>
</soapenv:Envelope>

输出 -

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>      
   </soapenv:Header>
   <soapenv:Body>
      <axis2ns682:Create xmlns:axis2ns682="http://g22.test01.org/test02/RF">
         <tns:CreateDetails xmlns:tns="http://g22.test01.org/test02/RF">
            <tns:EventUser>MyUsername</tns:EventUser>
            <tns:PreApprovedTemplateID>221398</tns:PreApprovedTemplateID>
            <tns:Priority>High</tns:Priority>
            <tns:PlannedImplementation_Start>2017-09-29</tns:PlannedImplementation_Start>
         </tns:CreateDetails>
      </axis2ns682:Create>
   </soapenv:Body>
</soapenv:Envelope>

1 个答案:

答案 0 :(得分:0)

您的XSLT有三个问题

  1. 您尚未考虑XSLT中的命名空间。在XML中,元素位于各种名称空间中(EventUser元素位于名称空间http://g22.test01.org/test02/RF中,由tns:前缀表示。
  2. 您尚未编写任何内容以删除wsse:Security元素
  3. 匹配EventUser的模板正在选择Username,只有在UsernameEventUser的孩子时才会选择<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://g22.test01.org/test02/RF" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" version="1.0"> <xsl:template match="wsse:Security" /> <xsl:template match="tns:EventUser"> <xsl:copy> <xsl:value-of select="//soapenv:Header/wsse:Security/wsse:UsernameToken/wsse:Username"/> </xsl:copy> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 。您实际上需要从soap:Header
  4. 中选择它

    试试这个XSLT

    {{1}}