删除XML标记之间的某些文本

时间:2013-05-21 15:12:32

标签: xml xslt

我需要一些帮助来转换这个XML文档:

<root>
<tree>
<leaf>Hello</leaf>
ignore me
<pear>World</pear>
</tree>
</root>

到此:

<root>
<tree>
<leaf>Hello</leaf>
<pear>World</pear>
</tree>
</root>

示例是简化的,但基本上,我可以删除所有“忽略我”的实例或者不在叶子或梨子里面的所有实例。

我只提出了几乎可以复制所有内容的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" encoding="UTF-8" standalone="yes"/>

    <xsl:template match="root|tree">
        <xsl:element name="{name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="leaf|pear">
        <xsl:element name="{name()}">
            <xsl:copy-of select="child::node()"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

我发现的是如何使用xsl:call-template删除 in 一个leaf或pear元素,但这对树中的内容不起作用 element。

提前致谢。

2 个答案:

答案 0 :(得分:4)

看起来像你正在寻找的身份变换。 因为应该忽略作为根或树的直接子项的文本,为此添加空模板。 因此,试试:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

    <xsl:output indent="yes" 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="tree/text()" />
    <xsl:template match="root/text()" />

</xsl:stylesheet>

将生成以下输出:

<root>
  <tree>
    <leaf>Hello</leaf>
    <pear>World</pear>
  </tree>
</root>

答案 1 :(得分:2)

这是另一个选项,它将从具有混合内容(元素和文本)的任何元素中删除文本...

XML输入

<root>
    <tree>
        <leaf>Hello</leaf>
        ignore me
        <pear>World</pear>
    </tree>
</root>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*[* and text()]">
        <xsl:copy>
            <xsl:apply-templates select="@*|*"/>
        </xsl:copy>     
    </xsl:template>

</xsl:stylesheet>

XML输出

<root>
   <tree>
      <leaf>Hello</leaf>
      <pear>World</pear>
   </tree>
</root>

此外,如果文本真的只是ignore me,你可以这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="text()[normalize-space(.)='ignore me']"/>

</xsl:stylesheet>