我有一个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蛋糕