3

我需要一些帮助来转换这个 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 删除叶子或梨元素的文本,但这不适用于元素内的内容。

提前致谢。

4

2 回答 2

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>
于 2013-05-21T15:19:46.323 回答
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>

此外,如果文本真的是 only 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>
于 2013-05-21T15:23:59.557 回答