我有一个XML:
<ProdOrders>
<ProdOrder>
<Id>20</Id>
<ProdOrderNo>1107939.001</ProdOrderNo>
<ChargeNumbers>
<ChargeNo>C_1_1107939.001</ChargeNo>
<ChargeNo>C_2_1107939.001</ChargeNo>
<ChargeNo>C_3_1107939.001</ChargeNo>
<ChargeNo>C_4_1107939.001</ChargeNo>
<ChargeNo>C_5_1107939.001</ChargeNo>
<ChargeNo>C_6_1107939.001</ChargeNo>
</ChargeNumbers>
</ProdOrder>
</ProdOrders>
在XSLT中有一个for-each循环。是否可以删除/删除刚刚在for-each循环中使用的实际最后一个节点,并继续下一个节点,直到所有这些节点都被删除?
<xsl:template match="ProdOrders">
<xsl:for-each select="ProdOrder">
<xsl:for-each select="ChargeNumbers/ChargeNo">
<!-- Do something with the ChargeNo Value -->
<!-- Now delete the Node <ChargeNo> with its value and continue for-each loop -->
</xsl:for-each>
</xsl:for-each>
因此,XML将改为:
<ProdOrders>
<ProdOrder>
<Id>20</Id>
<ProdOrderNo>1107939.001</ProdOrderNo>
<ChargeNumbers>
<ChargeNo>C_2_1107939.001</ChargeNo>
<ChargeNo>C_3_1107939.001</ChargeNo>
<ChargeNo>C_4_1107939.001</ChargeNo>
<ChargeNo>C_5_1107939.001</ChargeNo>
<ChargeNo>C_6_1107939.001</ChargeNo>
</ChargeNumbers>
</ProdOrder>
</ProdOrders>
在for-each循环中,第一个经过处理的项将是<ChargeNo>C_2_1107939.001</ChargeNo>
。
我对Xsl/-t有点陌生,我甚至不知道这样做是否可行,或者我有什么选择。
发布于 2014-10-01 07:38:54
下面的样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ChargeNo">
<xsl:choose>
<!-- alternatively, you can choose position() = 1, for the first occurrence -->
<xsl:when test="position()=last()"/>
<xsl:otherwise>
<xsl:copy>
<xsl:value-of select="concat(., '-test')"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当应用于输入XML时,生成:
<ProdOrders>
<ProdOrder>
<Id>20</Id>
<ProdOrderNo>1107939.001</ProdOrderNo>
<ChargeNumbers>
<ChargeNo>C_1_1107939.001-test</ChargeNo>
<ChargeNo>C_2_1107939.001-test</ChargeNo>
<ChargeNo>C_3_1107939.001-test</ChargeNo>
<ChargeNo>C_4_1107939.001-test</ChargeNo>
<ChargeNo>C_5_1107939.001-test</ChargeNo>
</ChargeNumbers>
</ProdOrder>
</ProdOrders>
发布于 2014-10-01 08:23:22
我看不出你在摆脱这个被丢弃的价值之前做了什么。您所显示的结果可以实现得更简单,如:
<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>
<!-- suppress the first ChargeNo -->
<xsl:template match="ChargeNo[1]"/>
</xsl:stylesheet>
https://stackoverflow.com/questions/26136027
复制相似问题