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



我有一个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(.))"

它们似乎都不适合我。

請聽從Mathias的建議,處理您的舊問題。当有一个有效的答案时,您应该选择一个可接受的答案,而不仅仅是继续下一个问题。

通过标识模板和模板模式匹配,您的问题的答案相当简单。

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

Xslt蛋糕

相关内容

  • 没有找到相关文章