XSLT - 对重复元素的引用

时间:2016-06-23 14:41:47

标签: xml xslt

使用XSLT2并给出以下类型的文件:

<refbody>
  <p>That's line 1<fn>It does this</fn></p>
  <b>That's line 2<fn>It does that</fn></b>
  <div>
    <p>That's line 3<fn>It does this</fn></p>
  </div>
</refbody>

我想创建以下内容:

<refbody>
  <p>That's line 1<fn id="123">It does this</fn></p>
  <b>That's line 2<fn>It does that</fn></b>
  <div>
    <p>That's line 3<xref href="123"/></p>
  </div>
</refbody>

所以这个想法是:

对于每个fn标签,检查它是否有重复(即相同的文字)。

  • 如果是,如果它是第一个,那么它就是参考,我们给出 它是一个id。
  • 如果没有,请用fn元素替换当前xrefhref属性中使用引用的ID。

这些fn元素可以处于任何级别,无论是否分组,它们的位置都是绝对不可预测的。

到目前为止,我已尝试过以下内容:

 <xsl:template match="fn">
        <xsl:variable name="duplicated" select="//fn[text()=.]"/>
        <xsl:choose>
            <xsl:when test="count($duplicated) gt 1">
                <xsl:choose>
                    <xsl:when test="not(preceding-sibling::fn[text()=.] or preceding::fn[text()=.])">
                        <fn id="{generate-id(.)}">
                            <xsl:value-of select="text()"/>
                        </fn>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:variable name="root" select="name(node()[1])"/>
                        <xsl:variable name="id" select="$duplicated[1]/@id"/>
                        <xref href="{$id}"/> 
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>          
            <xsl:otherwise>
                <xsl:copy-of select="."></xsl:copy-of>
            </xsl:otherwise>
        </xsl:choose>                    
    </xsl:template>

显然,我无法访问此ID,所以这不好。

1 个答案:

答案 0 :(得分:2)

使用密钥识别重复项:

UPDATE ImageData
SET (Images = @image1, Login = @Login)
WHERE (some boolean test here);