簡體   English   中英

使用xslt獲取父節點值

[英]Get parent node value using xslt

下面是我的xml

    <?xml version="1.0" encoding="UTF-8"?>
<hotels xmlns="http://www.test.com/schemas/messages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://www.test.com/schemas/messages">
<hotel>
    <hotel>
        <rooms>
            <room name="Standard">
                <rates>
                    <rate id="1" adults="1" child="0"></rate>
                    <rate id="2" adults="2" child="0"></rate>
                    <rate id="3" adults="1" child="0"></rate>
                </rates>
            </room>
            <room name="Deluxe">
                <rates>
                    <rate id="4" adults="1" child="0"></rate>
                    <rate id="5" adults="2" child="0"></rate>
                    <rate id="6" adults="2" child="0"></rate>
                </rates>
            </room>
        </rooms>
    </hotel>
    </hotels>

我使用下面的xslt獲得我的輸出

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ms="http://www.test.com/schemas/messages" exclude-result-prefixes="ms xsi">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

            <xsl:key name="by-occupancy" match="ms:rooms/ms:room/ms:rates/ms:rate" use="concat(generate-id(ancestor::ms:rooms),'|',@adults)"/>

            <xsl:template match="ms:hotels/ms:hotel">
                <hotel>
                <xsl:apply-templates select="ms:rooms/ms:room/ms:rates/ms:rate[generate-id() = generate-id(key('by-occupancy', concat(generate-id(ancestor::ms:rooms),'|',@adults))[1])]" mode="fun_options"/>
                </hotel>
            </xsl:template>

            <xsl:template match="ms:rate" mode="fun_options">
            <rates>
                <xsl:for-each select="key('by-occupancy', concat(generate-id(ancestor::ms:rooms),'|',@adults))">
                <rate><xsl:value-of select="../../../ms:room/@name"/>-<xsl:value-of select="@id"/>-<xsl:value-of select="@adults"/></rate>
                </xsl:for-each>
            </rates>
            </xsl:template>

        </xsl:stylesheet>

我需要像下面這樣放

<hotel>
  <rates>
    <rate>Standard-1-1</rate>
    <rate>Standard-3-1</rate>
    <rate>Deluxe-4-1</rate>
  </rates>
  <rates>
    <rate>Standard-2-2</rate>
    <rate>Deluxe-5-2</rate>
    <rate>Deluxe-6-2</rate>
  </rates>
</hotel>

但是這里的房間名稱不能正常工作..它僅使用xml中的第一個房間節點。 我如何根據ID放置當前房間名稱

我認為不是../../../ms:room/@name而是您想要ancestor::ms:room/@name 請注意,您發布的XML示例在樣式表中並未使用名稱空間,因此您必須更正一個或多個名稱空間才能使它們協同工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM