xslt条件转换

时间:2015-03-25 10:58:56

标签: xml xslt-1.0

我正在尝试提供一个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>

感谢名单!

2 个答案:

答案 0 :(得分:0)

这样的东西应该可行,但是如果结果树是空的,你很可能会遇到一些错误......

<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>

答案 1 :(得分:0)

  

如何修改我的xslt以评估其值   <isDigitalProduct>以便当其值为&#34; true&#34;时,复制所有内容   当它的值为&#34; false&#34;?

时产生一个空白输出

如果你想要做所有,你可以做到:

<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>

  

还有一个问题,如果不是复制我需要的一切,该怎么办?   将<isDigitalProduct>元素转换为<SerialNumber>

在这种情况下,您不会按照复制符合条件的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>