1

我目前有一个如下所示的 xml 文档:

<site>
  <body>
    <group name="content">
      <Categories>
        <item id="1" name="cat1">
          <Children>
            <item id="2" name="cat2">
              <Children>
                <item id="3" name="cat3">
                  <Children>
                    <item id="4" name="cat4" />
                  </Children>
                </item>
                <item id="5" name="cat5">
                  <Children>
                    <item id="6" name="cat6" />
                    <item id="7" name="cat7" />
                    <item id="8" name="cat8" />
                  </Children>
                </item>
                <item id="9" name="cat9" />
                <item id="10" name="cat10" />
              </Children>
            </item>
          </Children>
        </item>
      </Categories>
    </group>
  </body>
</site>

如果用户选择了 id=3 的类别:

我如何[在我的 xsl 样式表中],选择从根 Categories 元素到所选元素的所有后代,并遍历它们?也许是这样的:

<xsl:for-each select="//Categories//*[@id=3 and ancestor::Categories[1]]"> . .   ?

留给我的只是:

<xsl:value-of select="@name" /> >

导致:

cat1 > cat2 > cat3 >

如果需要进一步澄清,请告诉我。

非常感谢。

4

1 回答 1

0

这种转变

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="item[@id=3]">
  <xsl:apply-templates mode="ancestors"
    select="ancestor-or-self::item"/>
 </xsl:template>

 <xsl:template match="item" mode="ancestors">
  <xsl:if test="not(position()=1)"> > </xsl:if>
  <xsl:value-of select="@name"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<site>
  <body>
    <group name="content">
      <Categories>
        <item id="1" name="cat1">
          <Children>
            <item id="2" name="cat2">
              <Children>
                <item id="3" name="cat3">
                  <Children>
                    <item id="4" name="cat4" />
                  </Children>
                </item>
                <item id="5" name="cat5">
                  <Children>
                    <item id="6" name="cat6" />
                    <item id="7" name="cat7" />
                    <item id="8" name="cat8" />
                  </Children>
                </item>
                <item id="9" name="cat9" />
                <item id="10" name="cat10" />
              </Children>
            </item>
          </Children>
        </item>
      </Categories>
    </group>
  </body>
</site>

产生想要的正确结果:

cat1 > cat2 > cat3

更新

在评论中,OP 问道:

我怎样才能动态设置'id'match="item[@id=3]". .,而不是让一行说 <xsl:template match="item[@id=3]"> . .我可以说 <xsl:template match="item[@id=$param]">

假设您有一个$pId包含所需值的全局参数

在 XSLT 2.0 中,只需修改xsl:templatefrom:

 <xsl:template match="item[@id=3]">

 <xsl:template match="item[@id=$pId]">

在 XSLT 1.0 中,不允许在匹配模式中有变量/参数引用。下面是一个涵盖新要求的 XSLT 1.0 解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pId" select="3"/>

 <xsl:template match="item">
  <xsl:apply-templates mode="ancestors"
    select="self::*[@id=$pId]/ancestor-or-self::item"/>
  <xsl:apply-templates select="node()[not(current()/@id = $pId)]"/>
 </xsl:template>

 <xsl:template match="item" mode="ancestors">
  <xsl:if test="not(position()=1)"> > </xsl:if>
  <xsl:value-of select="@name"/>
 </xsl:template>
</xsl:stylesheet>
于 2013-01-27T02:36:57.750 回答