我有以下样式表来跳过标签XYZ_1,XYZ_2。
提前致谢。
<?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>
答案 0 :(得分:3)
使用强>:
<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文档,而忽略文档中任何仅限空格的文本节点。因此,转换不会看到仅空白节点,因此没有这样的节点被复制到输出。这消除了不需要的空白,作为第二个问题报告。
答案 1 :(得分:2)
我相信你会使用starts-with,如下所示:
<xsl:template match="*[starts-with(name(), 'XYZ_')]">
这应该将模板应用于以指定的四个字符开头的任何元素。
不确定所提供的有关您问题第二部分的信息。你可以发布一个被解析文件的样本吗?