使用XSLT基于空元素插入条件数据

时间:2014-12-19 19:49:24

标签: xml xslt xslt-1.0

我有一个XML流,我需要根据元素是否包含数据或是否为空来插入内容。

我尝试了几种技术,但它仍无效。

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="pricesample.xml" -->
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8"/>

<xsl:template match="catalog">

<catalog>
<xsl:for-each select="shoe">
<shoe>
<xsl:value-of select="name"/><xsl:text> </xsl:text>
<xsl:apply-templates select="price" />
</shoe>
</xsl:for-each>
</catalog>
</xsl:template>

<xsl:template match="price">
  <xsl:choose>
    <xsl:when test=". =''">
      <price><xsl:text>Price is Empty</xsl:text></price><xsl:text>
      </xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <price><xsl:text> $</xsl:text><xsl:value-of select="."/></price><xsl:text>
      </xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>


</xsl:stylesheet>

这是XML:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<shoe>
    <name>Shoe 1</name>
    <price>49.98</price>
</shoe>
<shoe>
    <name>Shoe 2</name>
    <price>65.5</price>
</shoe>
<shoe>
    <name>Shoe 3</name>
    <price>70</price>
</shoe>
<shoe>
    <name>Shoe 4</name>
    <price/>
</shoe>
<shoe>
    <name>Shoe 5</name>
    <price/>
</shoe>
</catalog>

所以输出应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<shoe>
    <name>Shoe 1</name>
    <price>$49.98</price>
</shoe>
<shoe>
    <name>Shoe 2</name>
    <price>$65.5</price>
</shoe>
<shoe>
    <name>Shoe 3</name>
    <price>$70</price>
</shoe>
<shoe>
    <name>Shoe 4</name>
    <price>Price is Empty</price>
</shoe>
<shoe>
    <name>Shoe 5</name>
    <price>Price is Empty</price>
</shoe>
</catalog>

我尝试了几项测试,包括:

test=". =''"
test="not(price)"
test="not(string(.))"

它们似乎都不适合我。

1 个答案:

答案 0 :(得分:2)

请注意Mathias&#39;建议照顾你的旧问题。你应该选择一个有效的答案,而不仅仅是继续下一个问题。

使用身份模板和模板模式匹配,您的问题的答案相当简单。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes"/>

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

  <xsl:template match="price">
    <xsl:copy>
      <xsl:value-of select="concat('$', .)" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="price[not(node())]">
    <xsl:copy>Price is Empty</xsl:copy>
  </xsl:template>

</xsl:stylesheet>

在样本输入上运行时,结果为:

<catalog>
  <shoe>
    <name>Shoe 1</name>
    <price>$49.98</price>
  </shoe>
  <shoe>
    <name>Shoe 2</name>
    <price>$65.5</price>
  </shoe>
  <shoe>
    <name>Shoe 3</name>
    <price>$70</price>
  </shoe>
  <shoe>
    <name>Shoe 4</name>
    <price>Price is Empty</price>
  </shoe>
  <shoe>
    <name>Shoe 5</name>
    <price>Price is Empty</price>
  </shoe>
</catalog>

XsltCake