使用xslt将子命名空间添加到子元素

时间:2010-08-26 10:29:34

标签: xslt

下面是输入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>

2 个答案:

答案 0 :(得分:0)

您的XML无效,但我认为您错过了结束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']"对我来说有点奇怪。你想达到什么目的?也许我们可以帮助解释为什么这不适合这样做。

答案 1 :(得分:0)

如果您希望 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>