【问题标题】:Joining nodes from two different lists with xslt使用 xslt 连接来自两个不同列表的节点
【发布时间】:2016-08-13 02:53:15
【问题描述】:

我正在使用以下 xml 格式:

<Books>
    <Book Num="1">
        <Number>12335</Number>
        <Year>2011</Year>
        <Pages>400</Pages>
        <CustomerID>1</CustomerID>
    </Book>
    <Book Num="2">
        <Number>6954</Number>
        <Year>2001</Year>
        <Pages>40</Pages>
        <CustomerID>2</CustomerID>
    </Book>
</Books>
<Customers>
    <Customer Num="1">
        <Name>John</Name>
    </Customer>
    <Customer Num="2">
        <Name>Mary</Name>
    </Customer>
</Customers>

书籍通过书籍中的 CustomerID 和 Customer 上的 Num 属性连接到客户。我通过遍历书籍制作了一个表格,但需要添加一个包含当前拥有它的客户名称的列。 我尝试过这样的事情,但没有成功:

<xsl:for-each select="xml/Books/Book">
    <tr>
        <td>
            <xsl:value-of select="Number"></xsl:value-of>
        </td>
        <td>
            <xsl:value-of select="Year"></xsl:value-of>
        </td>
        <td>
            <xsl:value-of select="Pages"></xsl:value-of>
        </td>
        <td>
            <xsl:value-of select="xml/Customers/Customer[@Num = current()/@CustomerID]/Name"></xsl:value-of>
        </td>
    </tr>
</xsl:for-each>

有没有办法实现我的需要?

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    问题在于您的xsl:value-of 当前与当前的Book 节点相关(即它正在寻找一个xml 元素,它是Book 元素的子元素),而不是从头开始查找再次查看文档。您应该在表达式的开头添加/

    另外,CustomerID 是一个元素,而不是一个属性,所以你不应该在它之前使用@

    试试这个...

    <xsl:value-of select="/xml/Customers/Customer[@Num = current()/CustomerID]/Name" />
    

    或者,您可以使用xsl:key 通过@Num 查找Customer 元素

    试试这个 XSLT

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="html" />
    
        <xsl:key name="cust" match="Customer" use="@Num" />
    
        <xsl:template match="/">
            <xsl:for-each select="xml/Books/Book">
                <tr>
                    <td>
                        <xsl:value-of select="Number"></xsl:value-of>
                    </td>
                    <td>
                        <xsl:value-of select="Year"></xsl:value-of>
                    </td>
                    <td>
                        <xsl:value-of select="Pages"></xsl:value-of>
                    </td>
                    <td>
                        <xsl:value-of select="key('cust', CustomerID)/Name" />
                    </td>
                </tr>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 非常感谢!第一个选择对我有用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多