我正在处理具有多个不同标签的XML。我正在匹配标签并将标签的值复制到新标签中。我对这个xslt只有一个问题。如果我正在处理的标签中不存在值信息怎么办?在xslt转换后,我总是得到空文本标签。可以以某种方式避免这种情况,因此如果XML中不存在info标签,那么新的文本标签也会被删除吗?希望我清楚我的问题是什么。感谢您的任何建议。
我的XSLT:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="test">
<text>
<xsl:apply-templates select="info/text()"/>
</text>
</xsl:template>
答案 0 :(得分:1)
创建一个额外的模板来处理info
元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="test">
<xsl:apply-templates select="info"/>
</xsl:template>
<xsl:template match="info">
<text>
<xsl:apply-templates select="."/>
</text>
</xsl:template>
</xsl:stylesheet>
例如,在这个简单的输入上:
<r>
<test>
<info>blah</info>
</test>
<test></test>
</r>
生成以下输出:
<r>
<text>blah</text>
</r>
您没有提供任何示例输入或输出,因此很难判断这是否正是您正在寻找的内容,但总的想法就是这样。
答案 1 :(得分:0)
您可以在模板的match
属性中包含该要求:只需为文本节点的存在添加谓词测试。
test[info/text()]
只有当test
元素有一个名为info
的子元素且其中包含非空文本节点时,上述XPath表达式才会匹配。
否则,您还可以使用xsl:if
元素并测试是否存在文本节点。
<xsl:if test="info/text()">
<text>
<xsl:apply-templates select="info/text()"/>
</text>
</xsl>