Xslt 解析xml以跳过标记

Xslt 解析xml以跳过标记,xslt,xpath,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 met

我有下面的样式表来跳过标记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>

标记名1
1.pdf
chart1.gif
输出结果为

<?xml version="1.0" encoding="UTF-8"?>
<tags>
    <tag>
        <tag1>TagName1</tag1>





    </tag>
</tags>

标记名1

我相信您会使用开头,如下所示:

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

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


从你问题的第二部分所提供的信息来看,我不确定。您能发布一个正在解析的文件示例吗?

我相信您会使用开头,如下所示:

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

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

从你问题的第二部分所提供的信息来看,我不确定。您可以发布正在分析的文件的示例吗?

使用:

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

应用于提供的XML文档时

<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 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
1.pdf
chart1.gif
生成所需的正确结果

<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 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
说明

<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 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()
    以()开头,并且该模板的主体为空,这将有效地从输出中删除任何匹配的元素

  • 指令
    指示XSLT处理器解析XML文档,忽略文档中的任何纯空白文本节点。因此,转换不会看到只有空格的节点,因此不会将此类节点复制到输出。这消除了不需要的空白,这是第二个问题

  • 使用

    <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 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>
    
    
    
    应用于提供的XML文档时

    <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 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
    1.pdf
    chart1.gif
    
    生成所需的正确结果

    <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 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
    
    说明

    <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 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()
    以()开头,并且该模板的主体为空,这将有效地从输出中删除任何匹配的元素

  • 指令
    指示XSLT处理器解析XML文档,忽略文档中的任何纯空白文本节点。因此,转换不会看到只有空格的节点,因此不会将此类节点复制到输出。这消除了不需要的空白,这是第二个问题


  • 只需编辑问题以反映正在解析的xml文件和输出produced只需编辑问题以反映正在解析的xml文件和输出producedGood问题+1。请参阅我的答案,以获得两个问题的完整、简短和简单的解决方案。这个解决方案使用了最基本、最强大的XSLT设计模式——覆盖标识规则。请参阅我的答案,以获得两个问题的完整、简短和简单的解决方案。此解决方案使用最基本、最强大的XSLT设计模式——覆盖标识规则。