xslt - 解析xml以跳过标签

标签 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>

最佳答案

用:

<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/

相关文章:

dom - 与importXML一起使用的XPath表达式

xslt - XSL : how to select a unique nodes in a nodeset

tomcat - 如何在 Tomcat 9 上使用撒克逊

XSLT 中的变量如何在同一 XSLT 的不同位置声明、赋值和使用该变量

xml - 忽略子节点的 XPath 表达式

java - 解析 XML 仅获取注释和日期值

xslt - 动态 XSLT 转换

c# - 在 XSLT 扩展方法的返回值上使用 Xpath

xml - 使用 XSLT 删除第一个 <p> 标签

python - 抓取削时如何消除某些元素?