我需要一些帮助来转换这个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。
提前致谢。
答案 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>