解析xml以跳过标签

时间:2011-02-10 03:16:41

标签: xslt xpath

我有以下样式表来跳过标签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>

2 个答案:

答案 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>

<强>解释

  1. 身份规则(除非覆盖)按原样复制每个节点

  2. 唯一重写的模板是匹配name() starts-with()“XYZ _”的元素,并且此模板具有空体 - 这有效地删除了任何匹配的元素输出

  3. <xsl:strip-space elements="*"/>指令指示XSLT处理器解析XML文档,而忽略文档中任何仅限空格的文本节点。因此,转换不会看到仅空白节点,因此没有这样的节点被复制到输出。这消除了不需要的空白,作为第二个问题报告。

答案 1 :(得分:2)

我相信你会使用starts-with,如下所示:

<xsl:template match="*[starts-with(name(), 'XYZ_')]">

这应该将模板应用于以指定的四个字符开头的任何元素。

不确定所提供的有关您问题第二部分的信息。你可以发布一个被解析文件的样本吗?