Атрибути за насочване в XSL трансформация

Имам следния xml:

<Head>
    <Group1>
        <Ref>
            <RefType>ABC123</RefType>
            <RefIdentifier>123456789</RefIdentifier>
            <RefDate>2013-11-30</RefDate>
        </Ref>
    </Group1>
    <Group2>
        <UOM>
            <UOMType>XYZ789</UOMType>
            <UOMIdentifier>BlahBlah</UOMIdentifier>
        </UOM>
    </Group2>
    <Group3>
        <Rec>
            <RecType>XYZ789</RecType>
            <RecIdentifier>HalbHalb</RecIdentifier>
        </Rec>
    </Group3>
</Head>

което трябва да трансформирам в:

<Head>
    <Ref>
      <Identifier type="ABC123">123456789</Identifier>
      <RefDate>2013-11-30</RefDate>
    </Ref>
    <UOM>
      <Identifier type="XYZ789">BlahBlah</Identifier>
    </UOM>
    <Rec>
      <Identifier type="XYZ789">HalbHalb</Identifier>
    </Rec>
</Head>

използвайки xslt. До момента имам следното:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:apply-templates select="/Head"/>
    </xsl:template>



    <xsl:template match="Head">
        <Head>
            <xsl:for-each select="Group1/Ref">
                <Ref>
                    <Identifier><xsl:value-of select="RefIdentifier"/></Identifier>
                    <RefDate><xsl:value-of select="RefDate"/></RefDate> 
                </Ref>
            </xsl:for-each>
            <xsl:for-each select="Group2/UOM">
                <UOM>
                    <Identifier><xsl:value-of select="UOMIdentifier"/></Identifier> 
                </UOM>
            </xsl:for-each>
            <xsl:for-each select="Group3/Rec">
                <Rec>
                    <Identifier><xsl:value-of select="RecIdentifier"/></Identifier> 
                </Rec>
            </xsl:for-each>
        </Head>
    </xsl:template>

</xsl:stylesheet>

което ми дава

<Head>
    <Ref>
        <Identifier>123456789</Identifier>
        <RefDate>2013-11-30</RefDate>
    </Ref>
    <UOM>
        <Identifier>BlahBlah</Identifier>
    </UOM>
    <Rec>
        <Identifier>HalbHalb</Identifier>
    </Rec>
</Head>

но не знам как да получа атрибута „type“ и неговата стойност в таговете „Identifier“ за таговете Ref, UOM и Rec. Как мога да направя това?


person user3042151    schedule 27.11.2013    source източник
comment
Изглежда, че заглавието ви е неправилно: опитвате се да трансформирате XML, а не XSL, като използвате XSLT. Освен това заглавието трябва да е по-конкретно: трансформирането на XML чрез XSLT е цял жанр от въпроси.   -  person LarsH    schedule 27.11.2013
comment
P.S. Добре дошли в stackoverflow. :-)   -  person LarsH    schedule 27.11.2013


Отговори (2)


но не знам как да получа атрибута „type“ и неговата стойност в таговете „Identifier“ за таговете Ref, UOM и Rec. Как мога да направя това?

Използвайте:

<Identifier type="{RefType}"><xsl:value-of select="RefIdentifier"/></Identifier>

Къдравите скоби са шаблон за стойност на атрибут, който ви позволява да замените стойността на XPath израза вътре в тях. Те са разрешени само в определени стойности на атрибути в XSLT таблица със стилове, но едно често срещано място за използването им е в буквални елементи на резултата.

За информация: Ref, UOM и Rec не са "тагове", а елементи. Те са сериализирани с помощта на начални и крайни тагове, но XSLT не работи с таговете; действа върху елементите. Мисленето и говоренето за тях от гледна точка на етикети е като да кажете „Дължа ръката на Стив $5“ вместо „Дължа на Стив $5“. Не се опитвам да бъда педантичен, но мисленето за XML като дърво от възли, където всеки елемент е един възел вместо два отделни етикета, ще ви помогне да разберете по-добре как работят стиловите таблици. XSLT преобразува едно дърво в друго дърво и сериализирането в тагове се случва само след като таблицата със стилове е завършена; понякога XSLT дори няма никакъв контрол върху сериализацията.

person LarsH    schedule 27.11.2013
comment
P.S. Подходът на Боб, използващ <xsl:attribute>, също е валиден. Но ако вече използвате литерален резултатен елемент за <Identifier>, вместо <xsl:element>, обикновено няма причина да използвате по-подробния <xsl:attribute> вместо буквален резултатен атрибут. - person LarsH; 27.11.2013

Използвайте маркера attribute:

<Identifier>
  <xsl:attribute name="type"><xsl:value-of select="RefType"/></xsl:attribute>
  <xsl:value-of select="RefIdentifier"/>
</Identifier>

Това вмъква типа като атрибут.

person Bob Dalgleish    schedule 27.11.2013