xsl:key匹配来自上下文的当前节点

时间:2013-10-17 09:11:10

标签: xslt xslt-1.0 xslkey

我有一些像这样的xml结构:

<Work>
<Good id ="1">
<outputList>
<outputRow id = "111" pid = "1" pos ="null" desc="List 1"/>
<outputRow id = "112" pid = "111" pos ="null" desc="Category 1"/>
<outputRow id = "113" pid = "112" pos ="1.1" desc="Position 1.1"/>
<outputRow id = "114" pid = "113" pos ="1.1.1" desc="Position 1.1.1"/>
</outputList>
</Good>
<Good id ="2">
<outputList>
<outputRow id = "111" pid = "1" pos ="null" desc="List 1"/>
<outputRow id = "112" pid = "111" pos ="null" desc="Category 1"/>
<outputRow id = "113" pid = "112" pos ="1.1" desc="Position 1.1"/>
<outputRow id = "114" pid = "113" pos ="1.1.1" desc="Position 1.1.1"/>
<outputRow id = "211" pid = "1" pos ="null" desc="List 2"/>
<outputRow id = "212" pid = "211" pos ="null" desc="Category 3"/>
<outputRow id = "213" pid = "212" pos ="3.1" desc="Position 3.1"/>
<outputRow id = "214" pid = "213" pos ="3.1.1" desc="Position 3.1.1"/>
</outputList>
</Good>
<Work>

我想要那样的输出: 对于每个商品,对于每个listOutput中的每个列表,我希望看到列表位置的树。 对于上面的例子,我想看看:

好(1) 清单1。  第1类。   立场1.1    位置1.1.1

好(2) 清单1。  第1类。   立场1.1    位置1.1.1

清单2。  第3类。   立场3.1    立场3.1.1

我使用xsl:key通过parentId获取子元素:

<xsl:key name="elementsByPid" match="ns1:outputRow[@pid]" use="@pid" />

此关键函数用于递归以创建列表类别和位置树:

<xsl:template match="/ns1:Work/ns1:Good">
      <w:p wsp:rsidR="007E1332" wsp:rsidRDefault="007E1332" wsp:rsidP="007E1332">
        <w:pPr>
          <w:spacing w:before="40" />
        </w:pPr>
        <w:r wsp:rsidRPr="00557C88">
          <w:rPr>
            <w:b-cs />
            <w:i-cs />
            <w:lang w:val="EN-US" />
          </w:rPr>
          <w:t>
           <xsl:text>Good (</xsl:text>
      <xsl:value-of select="position()"></xsl:value-of>
            <xsl:text>) </xsl:text>
      </w:t>
      </w:r>   
      </w:p> 
    <xsl:apply-templates select="./ns1:outputList" mode="table" />
  </xsl:template>


   <xsl:template match="/ns1:Work/ns1:Good/ns1:outputList" mode="table">
        </xsl:attribute>
      </xsl:for-each>
      <xsl:apply-templates select="./ns1:outputRow[@pid=1]" mode="row" />
   </xsl:template>

  <xsl:template match="/ns1:Work/ns1:Good/ns1:outputList/ns1:outputRow" mode="row">
    <w:p wsp:rsidR="007E1332" wsp:rsidRDefault="007E1332" wsp:rsidP="007E1332">
      <w:pPr>
        <w:spacing w:before="40" />
      </w:pPr>
      <w:r wsp:rsidRPr="00557C88">
        <w:rPr>
          <w:b-cs />
          <w:i-cs />
          <w:lang w:val="EN-US" />
        </w:rPr>
        <w:t>
          <xsl:text>Пункт:</xsl:text>
          <xsl:value-of select="./@pos"/>
          <xsl:text>Описание: </xsl:text>
          <xsl:value-of select="./@desc"/>
        </w:t>
      </w:r>
    </w:p>
  <xsl:apply-templates select="key('elementsByPid', ./@id)" mode="row"/>
  </xsl:template>

问题是密钥匹配模式似乎在所有outputRows中搜索@pid,但我需要让它仅在outputRows中搜索来自上下文的当前商品。是否有可能实现这一目标?

1 个答案:

答案 0 :(得分:1)

您需要创建一个键,用于将商品的ID与outputRow的pid连接起来:

<xsl:key name="elementsByPid" match="ns1:outputRow[@pid]" use="concat(ancestor::ns1:Good/@id, '|', @pid)" />

然后使用key('elementsByPid', concat(ancestor::ns1:Good/@id, '|', @pid))