我有以下样式表,以跳过标签XYZ_1,XYZ_2。
我如何使其在XYZ_ *下工作
另外,在输出中被跳过的标签有空行,我该如何抑制它们。
提前致谢。
<?xml version="1.0" ?>
<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="no" encoding="utf-8" omit-xml-declaration="yes" />
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="XYZ_1" />
<xsl:template match="XYZ_2" />
</xsl:stylesheet>
这是示例XML
<?xml version="1.0" encoding="UTF-8"?>
<tags>
<tag>
<tag1>TagName1</tag1>
<XYZ_1>
<name>1.pdf</name>
</XYZ_1>
<XYZ_2>
<c_name>chart1.gif</c_name>
</XYZ_2>
</tag>
</tags>
输出结果到
<?xml version="1.0" encoding="UTF-8"?>
<tags>
<tag>
<tag1>TagName1</tag1>
</tag>
</tags>
最佳答案
用:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(), 'XYZ_')]"/>
</xsl:stylesheet>
当应用于提供的XML文档时:
<?xml version="1.0" encoding="UTF-8"?>
<tags>
<tag>
<tag1>TagName1</tag1>
<XYZ_1>
<name>1.pdf</name>
</XYZ_1>
<XYZ_2>
<c_name>chart1.gif</c_name>
</XYZ_2>
</tag>
</tags>
所需的正确结果产生了:
<tags>
<tag>
<tag1>TagName1</tag1>
</tag>
</tags>
说明:
身份规则(除非被覆盖)按原样复制每个节点
唯一覆盖的模板是
name()
starts-with()
“ XYZ_”的匹配元素,并且该模板的主体为空-这将有效地从输出中删除所有匹配的元素。<xsl:strip-space elements="*"/>
指令指示XSLT处理器解析XML文档,而忽略该文档中任何仅包含空格的文本节点。因此,转换不会看到仅纯空格的节点,因此不会将此类节点复制到输出。这消除了不必要的空格,这是第二个问题。
关于xslt - 解析xml以跳过标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953005/