2

考虑以下 xml 代码段。

<rootnode>
    <child id="child1" ><![CDATA[child 1]]></child>
    <child id="child2" ><![CDATA[child 2]]></child>
    <child id="child3" ><![CDATA[child 3]]></child>
    <child id="child4" ><![CDATA[child 4]]></child>
    <child id="child5" ><![CDATA[child 5]]></child>
    <child id="child6" ><![CDATA[child 6]]></child>
    <child id="A1" ><![CDATA[A 1]]></child>
    <child id="A2" ><![CDATA[A 2]]></child>
    <child id="A3" ><![CDATA[A 3]]></child>
    <child id="A4" ><![CDATA[A 4]]></child>
    <child id="A5" ><![CDATA[A 5]]></child>
    <child id="A6" ><![CDATA[A 6]]></child>
</rootnode>

我想使用 xslt 遍历所有具有 'child' 之类的 id 的孩子。
我如何实现这一目标?

4

3 回答 3

3

值得学习的不仅仅是在 XSLT 中使用 for each 循环——这是对同一事物的模板匹配方法:

<xsl:template match="/rootnode">
    <xsl:apply-template select="child[starts-with(@id, 'child')]" />
</xsl:template>

<xsl:template match="child">
    <!-- Do stuff -->
</xsl:template>

关键位是方括号中的 xpath 查询 - ajay_whiz 也建议用于 for-each 循环。

于 2010-08-17T07:58:52.433 回答
0

为了提高效率,您可以定义一个密钥并使用它,例如

<xsl:key name="k1" match="child" use="starts-with(@id, 'child')"/>

<xsl:template match="rootnode">
  <xsl:for-each select="key('k1', true())">
    ...
  </xsl:for-each>
</xsl:template>
于 2010-08-17T10:20:55.017 回答
0

你的 xslt 将是

<xsl:template match="/rootnode">
    <xsl:for-each select="child">
        <xsl:if test="contains(@id,'child')">
        ... do your stuff here....
        </xsl:if>
    </xsl:for-each>
</xsl:template>

您还可以使用starts-with函数参见http://www.w3schools.com/xpath/xpath_functions.asp 以获取完整参考

于 2010-08-17T06:56:17.057 回答