2017-04-02 162 views
1

我输入XMLXSLT模板匹配的动态节点

<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,我们想用一些ot她从节点取值的方法,然后进行节点的模板匹配和重命名。我猜这个要求需要xslt 2.0或3.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>