XSLT将PAGEID与元素ID匹配

时间:2011-01-25 19:00:52

标签: xslt

如何匹配XML文档中的两个单独数字?我的XML文档中有多个<PgIndexElementInfo>元素,每个元素代表一个不同的导航元素,每个元素都有一个唯一的<ID>。在文档的后面,<PageID>指定的数字有时与上面使用的<ID>匹配。我怎样才能将<PageID>与上面指定的<ID>进行匹配?

<Element>
    <Content>
        <PgIndexElementInfo>
            <ElementData>
                <Items>
                    <PgIndexElementItem>
                        <ID>1455917</ID>
                    </PgIndexElementItem>
                </Items>
            </ElementData>
        </PgIndexElementInfo>
    </Content>
</Element>
<Element>
    <Content>
        <CustomElementInfo>
            <PageID>1455917</PageID>
        </CustomElementInfo>
    </Content>
</Element>

编辑:

我将以下解决方案添加到我的代码中。存在的xsl:apply-templates用于重新创建在HTML和XML之间丢失的嵌套列表。我现在需要做的是将PageID与<PgIndexElementItem>的ID匹配,并将CSS类添加到它所属的<ul>。我希望这是有道理的。

<xsl:key name="kIDByValue" match="ID" use="."/> 
<xsl:template match="PageID[key('kIDByValue',.)]">
    <xsl:apply-templates select="//PgIndexElementItem[not(contains(Description, '.'))]" />
</xsl:template>

<xsl:template match="PgIndexElementItem">
  <li>
    <a href="{ResolvedURL/Absolute}"><xsl:value-of select="Title"/></a>
    <xsl:variable name="prefix" select="concat(Description, '.')"/>
    <xsl:variable name="childOptions"
      select="../PgIndexElementItem[starts-with(Description, $prefix)
        and not(contains(substring-after(Description, $prefix), '.'))]"/>
    <xsl:if test="$childOptions">
      <ul>
        <xsl:apply-templates select="$childOptions" />
      </ul>
    </xsl:if>
  </li>
</xsl:template>

1 个答案:

答案 0 :(得分:3)

处理交叉引用的XSLT方法是使用键。

匹配:与PageID元素引用的每个ID元素匹配的规则。

<xsl:key name="kIDByValue" match="ID" use="."/> 
<xsl:template match="PageID[key('kIDByValue',.)]"> 
    <!-- Template content -->
</xsl:template>

选择:选择具有特定值的每个PageID元素的表达式。

<xsl:key name="kPageIDByValue" match="PageID" use="."/> 
<xsl:template match="ID"> 
    <xsl:apply-templates select="key('kPageIDByValue',.)"/>
</xsl:template>