2

我在使用 XLTS 解析 XML 文件时遇到问题。

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
    <body style="margin-top: 0px;">
    <a name="top"/>
    <a name="menu"> </a>
    <a href="cool html"> </a>
    <table width="100%" cellspacing="0" cellpadding="2" border="0" class="aws_border sortable"/>
    </body>
    </html>

我需要删除所有节点<a name="something"> </a>,同时保留<a href>文档中的节点和其他节点。

我试过了

    <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
    <xsl:template match="body"> 
    <xsl:for-each select="a"> 
      <xsl:if test="@href != '' ">
     <xsl:copy-of select="."/> 
    </xsl:if>
         </xsl:for-each> 
    </xsl:template>
    </xsl:stylesheet>

但它只保留<a href >节点,并删除所有其他节点。

4

1 回答 1

4

保留所有节点并仅更改少数节点总是这样:

  1. 您使用身份模板。它复制(“保留”)所有未以其他方式处理的节点。
  2. 您为应该以不同方式处理的每个节点编写另一个模板。
  3. 你抵制使用的冲动<xsl:for-each>。你不需要它。

XSLT:

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

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

  <!-- empty template to remove <a name="..."> specifically -->    
  <xsl:template match="xhtml:a[@name]" />

</xsl:stylesheet>

就是这样。

第3点实际上非常重要。避免<xsl:for-each>在您编写的所有 XSLT 中使用。它似乎熟悉且有用,但事实并非如此。它的使用往往会导致难以重用的笨重、单一、深度嵌套的 XSLT 代码。

总是试着喜欢<xsl:template><xsl:apply-templates>过度<xsl:for-each>

于 2012-10-05T07:00:10.870 回答