删除没有相应id属性的refids

时间:2012-12-14 15:51:58

标签: xslt

我正在尝试清理一些XML文档并删除所有没有相应ID的idref。无论出于何种原因,我都没有得到解决这个愚蠢问题的语法。我以为会是这样的......

<xsl:template match="*">
 <xsl:variable name="id_list" select="@id"/>
 <xsl:if test="ref[not(contains($id_list, ./@rid))]">
   <!-- do nothing -->
 </xsl:if>
 <xsl:copy>
  <xsl:apply-templates select="node()|@*"/>
 </xsl:copy>
</xsl:template>
  • ref是元素名称,@rid是refid

示例输入将类似于以下内容......

<?xml version="1.0" encoding="iso-8859-1"?>
<article>
 <bdy>
  <p>In the second category [<ref rid="bibtts2009060795101" type="bib">2</ref>] and third category [<ref rid="bibtts2009060795102" type="bib">3</ref>]</p>
 </bdy>
 <bib>
  <bb pubtype="article" reftype="nonieee" id="bibtts2009060795101"><au sequence="first"><fnm>T.</fnm><snm>Smith</snm></au></bb>
 </bib>
</article>

第二个参考<ref rid="bibtts2009060795102" type="bib">3</ref>将被删除

1 个答案:

答案 0 :(得分:0)

<xsl:variable name="id_list" select="@id"/>
模板中的

$id_list变量设置为包含最多一个节点的节点集 - 作为模板中上下文节点的(单个)元素的id属性。更好的方法可能是在样式表的顶层定义,以将每个id值映射到其对应的元素

<xsl:key name="elementById" match="*[@id]" use="@id" />

然后给出特定的refid值,您可以使用id快速确定是否存在任何匹配的key('elementById', 'theRefValue')。这是一个完整的例子:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="elementById" match="*[@id]" use="@id" />

  <!-- copy everything verbatim by default -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <!-- but ignore all ref elements whose @rid does not
       correspond to any id -->
  <xsl:template match="ref[not(key('elementById', @rid))]" />
</xsl:stylesheet>

当应用于(示例文档的略微包装版本)

<?xml version="1.0" encoding="iso-8859-1"?>
<article>
 <bdy>
  <p>In the second category [<ref rid="bibtts2009060795101" type="bib">2</ref>]
     and third category [<ref rid="bibtts2009060795102" type="bib">3</ref>]</p>
 </bdy>
 <bib>
  <bb pubtype="article" reftype="nonieee" id="bibtts2009060795101"><au sequence="first"><fnm>T.</fnm><snm>Smith</snm></au></bb>
 </bib>
</article>

会产生

<?xml version="1.0" encoding="iso-8859-1"?>
<article>
 <bdy>
  <p>In the second category [<ref rid="bibtts2009060795101" type="bib">2</ref>]
     and third category []</p>
 </bdy>
 <bib>
  <bb pubtype="article" reftype="nonieee" id="bibtts2009060795101"><au sequence="first"><fnm>T.</fnm><snm>Smith</snm></au></bb>
 </bib>
</article>