<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将在所有节点中替换。
答案 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>