1

我有一个结构类似于的 XML 文件

<?xml version="1.0"?>
 <medias>
  <media>
    <id>34500</id>
    <refid/>
  </media>
  <media>
    <id>34501</id>
    <refid>34500</refid>
  </media>
  <media>
    <id>34502</id>
    <refid>34500</refid>
  </media>
  <media>
    <id>34503</id>
    <refid>34501</refid>
  </media>
 <media>
    <id>34504</id>
    <ref/>
 </media>   
 <media>
    <id>34505</id>
    <refid>34502</refid>
 </media>   
</medias>

使用 XSL 1.0,我想访问所有未被其他人引用的节点。所以我创建了两个变量

<xsl:variable name="origID" select="media/id/text()"/>
<xsl:variable name="refID" select="media/refid/text()"/>

并查看了如何在这两个元素集之间执行差异操作

<xsl:variable name="diffID" select="$origID[count(. | $refID) != count($refID)]"/>

结果是:

origID 包含 34500、34501、34502、34503、34504、34505

refID 包含 34500、34500、34501、34502

我期望

diffID 将包含 34503、34504、34505

diffID 仍然包含 34500、34501、34502、34503、34504、34505。

实现我的目标的最佳方法是获取其 ID 被其他节点引用的所有节点。

提前致谢

安德烈

4

2 回答 2

1

要将 refid 未引用的 id 获取到变量中,您可以尝试以下操作:

<xsl:variable name="diffID" select="media[not(id = //media/refid)]/id"/>

为了证明它有效,请使用:

<xsl:template match="/*">
    <xsl:variable name="diffID" select="media[not(id = //media/refid)]/id"/>
    <xsl:for-each select="$diffID" >
        <xsl:value-of select="."/>
        <xsl:text>, </xsl:text>
    </xsl:for-each>
</xsl:template>

这将生成以下输出。

34503, 34504, 34505,

如果实际文件大得多,您应该使用xsl:key

并且对变量中的 id 做同样的事情:

<xsl:template match="/*">
    <xsl:variable name="origID" select="media/id"/>
    <xsl:variable name="refID" select="media/refid"/>
    <xsl:variable name="diffID" select="$origID[not(. = $refID)]"/>
    <xsl:for-each select="$diffID" >
        <xsl:value-of select="."/>
        <xsl:text>, </xsl:text>
    </xsl:for-each>
</xsl:template>
于 2013-07-09T14:32:19.633 回答
1

使用 XSLT 2.0,您可以使用except运算符(只要您选择节点而不是原始值):

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

<xsl:variable name="medias-with-id" select="//media[id]"/>
<xsl:variable name="referenced-medias" select="key('by-id', //refid)"/>

<xsl:key name="by-id" match="media" use="id"/>

<xsl:template match="/">
  <xsl:copy-of select="$medias-with-id except $referenced-medias"/>
</xsl:template>

</xsl:stylesheet>
于 2013-07-09T14:40:29.740 回答