/ / Obter valor do nó pai usando xslt - xml, xslt, xslt-1.0

Obter o valor do nó pai usando xslt - xml, xslt, xslt-1.0

Abaixo está o meu 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>

Eu usando abaixo xslt para obter minha saída

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

Eu preciso colocar como abaixo

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

Mas aqui o nome da sala não está funcionando bem. É necessário apenas o primeiro nó da sala do xml. Como coloco o nome atual da sala com base no id

Respostas:

0 para resposta № 1

Eu acho que em vez de ../../../ms:room/@name você simplesmente quer ancestor::ms:room/@name. Observe que sua amostra XML publicada não usa espaços para nome, enquanto sua folha de estilo, você precisará corrigir um ou outro para que eles funcionem juntos.