XSLT转换以保留xml节点

时间:2015-12-14 14:31:51

标签: xslt

<Batches>
    <UploadInfo>   
        <UploadSAPInfo>          
          <BATCHID>100</BATCHID>
          <SerialNo>20141</SerialNo>
          <STATUS>P</STATUS>          
        </UploadSAPInfo>
        <UploadSAPInfo>          
          <BATCHID>100</BATCHID>
          <SerialNo>20142</SerialNo>
          <STATUS>P</STATUS>          
        </UploadSAPInfo>
    </UploadInfo>

   <UploadInfo>   
        <UploadSAPInfo>          
          <BATCHID>200</BATCHID>
          <SerialNo>20151</SerialNo>
          <STATUS>F</STATUS>          
        </UploadSAPInfo>
        <UploadSAPInfo>          
          <BATCHID>200</BATCHID>
          <SerialNo>20142</SerialNo>
          <STATUS>P</STATUS>          
        </UploadSAPInfo>
    </UploadInfo>
</Batches>

这是我的xml结构,我需要为每个uploadInfo改变BATCHID('B001','B002'..),并保留其他节点,因为它正在使用xslt。

我使用的XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
>

<xsl:output method="xml" indent="yes"/>

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

<xsl:template name="BATCHID">
   <xsl:text>B001</xsl:text>
</xsl:template>

<xsl:template name="UploadBatchTemplate" match="/">
      <xsl:for-each select="UploadBatchInfo">
        <xsl:call-template name="BATCHID"></xsl:call-template>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
<!-- end snippet -->

我不知道如何将整个节点传递给调用模板。 BATCHID将在所有节点中替换。

2 个答案:

答案 0 :(得分:1)

尝试这种方式,或许:

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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="BATCHID">
    <xsl:copy>
        <xsl:text>B</xsl:text>
        <xsl:number from="UploadInfo" level="any" format="001"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<Batches>
   <UploadInfo>
      <UploadSAPInfo>
         <BATCHID>B001</BATCHID>
         <SerialNo>20141</SerialNo>
         <STATUS>P</STATUS>
      </UploadSAPInfo>
      <UploadSAPInfo>
         <BATCHID>B002</BATCHID>
         <SerialNo>20142</SerialNo>
         <STATUS>P</STATUS>
      </UploadSAPInfo>
   </UploadInfo>
   <UploadInfo>
      <UploadSAPInfo>
         <BATCHID>B001</BATCHID>
         <SerialNo>20151</SerialNo>
         <STATUS>F</STATUS>
      </UploadSAPInfo>
      <UploadSAPInfo>
         <BATCHID>B002</BATCHID>
         <SerialNo>20142</SerialNo>
         <STATUS>P</STATUS>
      </UploadSAPInfo>
   </UploadInfo>
</Batches>

答案 1 :(得分:0)

此样式表允许您克隆输入XML中的每个节点(但它不处理属性):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="text()"><xsl:value-of select="."/></xsl:template>

</xsl:stylesheet>

如果您想特定处理某些节点,则只需添加特定模板即可:

<xsl:template match="BATCHID">
    <BATCHID>B<xsl:value-of select="."/></BATCHID>
</xsl:template>