【问题标题】:Strip tags from XML using XSLT All Except Some (Negate condition)使用 XSLT 从 XML 中剥离标签 All except Some(否定条件)
【发布时间】:2012-08-08 15:49:01
【问题描述】:

我想从我的 XML 文件中删除所有标签,除了有限数量的标签,我知道。我如何使用 XSLT 做到这一点。

我知道我可以使用以下内容从我的 xml 中删除 div 标签,但我想否定,例如 Strip all BUT Div。

  <xsl:template match = "div">
        <xsl:apply-templates select="@*|node()"/>
  </xsl:template>

XSLT 文件的更多片段:

  <xsl:template match="div"> <!-- switch the element name -->
    <xsl:element name="newdiv">
      <xsl:copy-of select="@*" />
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>

  <xsl:template match="div"/>
  <xsl:template match="*"> 
     <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
  </xsl:template>       

【问题讨论】:

    标签: xml xslt xml-parsing


    【解决方案1】:

    我相信这个问题已经是answered了。 使用两个模板。

    <xsl:template match="*">
       <!-- Everything -->
    </xsl:template>
    
    <xsl:template match="something | somethingelse">
       <!-- what you want ignored -->
    </xsl:template>
    

    第四次编辑。

    输入样本:

    <body>
        <table>
            <tr>
                <td>
                </td>
            </tr>
        <div>content</div>
        </table>
        <div>content again</div>
    </body>
    

    XSLT 转换来做你需要的:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
        <xsl:template match="div">
           <xsl:element name="div">
             <xsl:copy-of select="@*" />
             <xsl:apply-templates />
           </xsl:element>
        </xsl:template>
    
    
        <xsl:template match="*">
          <xsl:apply-templates select="@*|node()"/>
        </xsl:template>
    </xsl:stylesheet>
    

    这将删除除 DIV 之外的所有标签。并保留所有标签内容。我刚试过。

    【讨论】:

    • 这东西适用于属性,但我说的是元素/节点。您能否进一步描述解决方案。当我按照您的建议添加这两个模板匹配时,它们会从文件中删除所有内容。
    • 而且这个也会截断与这些标签相关的所有内容,我只想去除标签而不是值。
    • MalSu - 感谢您的帮助,但是当我执行这两个模板时,它会返回一个空的 xml,仅包含标题,因此它会删除所有内容,即所有标签和元素 &lt;xsl:template match="div" /&gt;&lt;xsl:template match="*"&gt; &lt;xsl:copy&gt; &lt;xsl:apply-templates select="@*|node()"/&gt; &lt;/xsl:copy&gt; &lt;/xsl:template&gt;
    • 看来您可能想改进匹配。您的文档样本可能会有所帮助。
    • 感谢 MalSu,我已经更新了上面的代码 sn-p 以显示我在做什么,实际上我首先重命名了一个节点,然后我想删除除 div 之外的所有其他标签文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多