NET中的xslt解析

NET中的xslt解析,xslt,xslt-2.0,xslcompiledtransform,Xslt,Xslt 2.0,Xslcompiledtransform,考虑以下xml代码片段 <rootnode> <child id="child1" ><![CDATA[child 1]]></child> <child id="child2" ><![CDATA[child 2]]></child> <child id="child3" ><![CDATA[child 3]]></child> <chi

考虑以下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遍历所有id类似于“child”的子对象。
如何实现这一点?

您的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>

... 在这里做你的事。。。。
您也可以使用以开头的
功能参见

作为完整的参考

值得学习的是,不要在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循环提出的建议。

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

<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>

...

我只想遍历id类似“child”的子节点,即它应该只返回我的子节点[child1,child2,child3,child3,child4,child5,child6]我得到了您的解决方案,但我有2000多个子节点。如果没有其他方法,我会说“有总比没有好”,谢谢你的回答。@Amit不确定你是否可以做一些事情,比如只做一个注释:问题被标记为xslt-2.0和xslcompiledtransform,但xslcompiledtransform只支持xslt 1.0。+1这是一个好答案。但是,如果没有必要,不要为每个指令推荐