XSLT转换和重命名节点

时间:2013-12-23 22:34:33

标签: xml xslt transformation

我正在处理具有多个不同标签的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>

2 个答案:

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