我有一个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(.))"
它们似乎都不适合我。
答案 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>