我正试图想出一个xslt,它可以将源xml中的所有内容复制到目标,也可以根据源文件中的某个值生成一个空文件。
假设我有source1.xml,如下所示:
<Order>
<isDigitalProduct>true</isDigitalProduct>
<productID>1234</productID>
<Order>
和source2.xml,如下所示:
<Order>
<isDigitalProduct>false</isDigitalProduct>
<productID>5678</productID>
<Order>
如何修改xslt以评估<isDigitalProduct>
的值,以便在其值为"true"时,按原样复制所有内容,并在其值"false"时生成空白输出?对于上面的示例,source1.xml将复制其内容,而转换后的source2.xml将生成一个空白文件。
感谢您的帮助!
还有一个问题,如果我不复制所需的所有内容,而是将<isDigitalProduct>
元素转换为<SerialNumber>
,会怎么样。例如,source2.xml仍转换为空输出,而source1.xml则转换为:
<Order>
<SerialNumber>ABC</SerialNumber>
<productID>1234</productID>
<Order>
谢谢!
如何修改xslt以评估
<isDigitalProduct>
,以便当其值为"true"时,复制所有内容按原样,并在其值为"false"时生成空白输出?
如果这是你想做的全部,你可以简单地做:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="Order[isDigitalProduct='true']"/>
</xsl:template>
</xsl:stylesheet>
还有一个问题,如果不是复制我需要的一切将CCD_ 5元素转换为CCD_。
在这种情况下,您不必按原样复制符合要求的Order
,而是将模板应用于它,并在该模板中进行任何所需的修改,例如:
<xsl:template match="/">
<xsl:apply-templates select="Order[isDigitalProduct='true']"/>
</xsl:template>
<xsl:template match="Order">
<xsl:copy>
<SerialNumber>ABC</SerialNumber>
<xsl:copy-of select="productID"/>
</xsl:copy>
</xsl:template>
类似的方法应该有效,但如果结果树为空,则很可能会出现一些错误。。。
<xsl:template match="Order">
<xsl:choose>
<xsl:when test="isDigitalProduct/text() = 'true'">
<xsl:copy-of select="."/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:template>