xsl选择具有子值的节点并将其作为参数传递

时间:2014-12-02 09:49:25

标签: xml xslt

我有一些问题需要访问我想要的节点。

这是我简化的xml:

<chain>
    <components>
        <component>
            <place>2</place>
            <name>bbb</name>
        </component>
        <component>
            <place>1</place>
            <name>aaa</name>
        </component>
        <component>
            <place>3</place>
            <name>ccc</name>
        </component>
    </components>
</chain>

我想要的输出:

aaa is connected to bbb
bbb is connected to ccc

和我的xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="text()"/>

<xsl:template name="writeComponent">
  <xsl:param name="my_component"/>
    <xsl:value-of select="$my_component/name"/>
</xsl:template>

<xsl:template match="/chain/components">
        <xsl:for-each select="component">
            <xsl:variable name="nextPlace" select="./place + 1"/>

            <xsl:call-template name="writeComponent">
                <xsl:with-param name="my_component" select='component'/>
            </xsl:call-template> 
            is connected to 
            <xsl:call-template name="writeComponent">
                <xsl:with-param name="my_component" select="component[place = '$nextPlace']"/>
            </xsl:call-template>

       </xsl:for-each> 
</xsl:template>
</xsl:stylesheet>  

我需要在参数

中使用不同的节点调用相同的模板

感谢任何帮助,谢谢

编辑:我找到了解决问题的方法

电话:

<xsl:call-template name="writeComponent">
    <xsl:with-param name="component_param" select="."/>
</xsl:call-template>
is connected to 
<xsl:call-template name="writeComponent">
    <xsl:with-param name="component_param" select="/chain/components/component[place = $nextPlace]"/>
</xsl:call-template>

在被调用的模板中,您需要循环<xsl:for-each select="$component_param">

1 个答案:

答案 0 :(得分:0)

select="component[place = '$nextPlace']中,您需要select="component[place = $nextPlace]才能正确引用变量。但是,由于for-each处理component元素,我不知道<xsl:with-param name="component" select='component'/>如何在您的示例XML中选择任何内容。模板匹配,for-each和调用模板的整个组合似乎有问题,您可能想向我们展示您想要的输入样本的结果,然后我们可以建议更简洁,更简单的XSLT方法。