添加命名空间来使用XSLT的子元素(Adding namespace to child elemen

2019-10-28 13:19发布

下面是输入XML:

<ns:TXLife xmlns:ns="http://ACORD.org/Standards/Life/2">

  <TXLifeResponse>
     <TransRefGUID/>
     <TransExeDate/>
     <TransExeTime/>

     <TransType tc="228"/>

</ns:TXLife>

以下是我的XSLT:

 xmlns:ns="http://ACORD.org/Standards/Life/2" version="1.0"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acor="http://www.foresters.com/esb/ws/wsdl/ACORD-v1.0" xmlns:ns="http://ACORD.org/Standards/Life/2"> <soapenv:Header/> <soapenv:Body> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </soapenv:Body> </soapenv:Envelope> </xsl:template> <xsl:template match="node() [local-name(.) = 'TXLife']"> <xsl:element name="ns:{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> 

通过使用这种穿越 - 我不能够命名空间添加前缀的TXLife的所有子元素。

如何命名空间前缀(NS)添加到所有的子元素? 所以它看起来应该如下

  <ns:TXLifeResponse>
     <ns:TransRefGUID/>
     <ns:TransExeDate/>
     <ns:TransExeTime/>

     <ns:TransType tc="228"/>

</ns:TXLife>

Answer 1:

如果你想要TXLife和后代得下http://ACORD.org/Standards/Life/2命名空间,使用这个样式表:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns="http://ACORD.org/Standards/Life/2"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <xsl:template match="/">
        <soapenv:Envelope>
            <soapenv:Header/>
            <soapenv:Body>
                <xsl:apply-templates/>
            </soapenv:Body>
        </soapenv:Envelope>
    </xsl:template>
    <xsl:template match="*[ancestor-or-self::ns:TXLife]">
        <xsl:element name="ns:{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出:

<soapenv:Envelope
 xmlns:ns="http://ACORD.org/Standards/Life/2"
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header />
    <soapenv:Body>
        <ns:TXLife>
            <ns:TXLifeResponse>
                <ns:TransRefGUID></ns:TransRefGUID>
                <ns:TransExeDate></ns:TransExeDate>
                <ns:TransExeTime></ns:TransExeTime>
                <ns:TransType tc="228"></ns:TransType>
            </ns:TXLifeResponse>
        </ns:TXLife>
    </soapenv:Body>
</soapenv:Envelope>


Answer 2:

您的XML是无效的,但我相信你just've错过了关闭TXLifeResponse元素。

下面的改造将做你想做的:

XML:

<?xml version="1.0" encoding="UTF-8"?>
<ns:TXLife xmlns:ns="http://ACORD.org/Standards/Life/2">

  <TXLifeResponse>
    <TransRefGUID/>
    <TransExeDate/>
    <TransExeTime/>

    <TransType tc="228"/>
  </TXLifeResponse>

</ns:TXLife>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns:ns="http://ACORD.org/Standards/Life/2">

  <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:acor="http://www.foresters.com/esb/ws/wsdl/ACORD-v1.0" 
      xmlns:ns="http://ACORD.org/Standards/Life/2">
      <soapenv:Header/>
      <soapenv:Body>
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </soapenv:Body>
    </soapenv:Envelope>
  </xsl:template>

  <xsl:template match="*">
    <xsl:element name="ns:{local-name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>

输出:

<soapenv:Envelope 
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:acor="http://www.foresters.com/esb/ws/wsdl/ACORD-v1.0" 
  xmlns:ns="http://ACORD.org/Standards/Life/2">
  <soapenv:Header/>
  <soapenv:Body>
    <ns:TXLife>
      <ns:TXLifeResponse>
        <ns:TransRefGUID/>
        <ns:TransExeDate/>
        <ns:TransExeTime/>
        <ns:TransType tc="228"/>
      </ns:TXLifeResponse>
    </ns:TXLife>
  </soapenv:Body>
</soapenv:Envelope>

模板xsl:template match="node()[local-name(.) = 'TXLife']"是有点怪我。 你想达到什么目的? 也许我们可以帮助解释为什么这是不恰当的方式来做到这一点。



文章来源: Adding namespace to child elements using xslt
标签: xslt