动态节点的XSLT模板匹配

时间:2017-04-02 05:28:00

标签: xslt-1.0 xslt-2.0

我的输入xml

   <ns1:TrackingResponse xmlns:ns1="http://sample/response">
    <TC10000004SF>
      <client_request>
        <id>402919</id>
        <client_order_id>66967604933444</client_order_id>
        <awb_number>TC10000004SF</awb_number>
      </client_request>
   </TC10000004SF>
   <TC10000005SF>
     <client_request>
        <id>402919</id>
        <client_order_id>66967604933444</client_order_id>
        <awb_number>TC10000005SF</awb_number>
     </client_request>
   </TC10000005SF>

我希望输出xml像

<TrackingResponse>
 <AWBNumber>
    <client_request>
        <id>402919</id>
        <client_order_id>66967604933444</client_order_id>
        <awb_number>TC10000004SF</awb_number>
    </client_request>
 </AWBNumber>
 <AWBNumber>
    <client_request>
        <id>402919</id>
        <client_order_id>66967604933444</client_order_id>
        <awb_number>TC10000005SF</awb_number>
    </client_request>
 </AWBNumber>
</TrackingResponse>

我们现在使用了以下xsl

<?xml version="1.0"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="*[starts-with(local-name(),'TC')]">
    <AWBNumber>
        <xsl:apply-templates select="node()"/>
    </AWBNumber>
</xsl:template>
<xsl:template match="*">
    <xsl:element name="{local-name(.)}">
        <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>
<xsl:template match="@*">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

由于我们正在硬编码SF,我们想要使用一些其他方法从节点获取值,然后进行模板匹配和节点重命名。我想这个要求需要xslt 2.0或3.0。请帮我一下。

1 个答案:

答案 0 :(得分:0)

你不能简单地做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*/*">
    <AWBNumber>
        <xsl:apply-templates/>
    </AWBNumber>
</xsl:template>

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

</xsl:stylesheet>