Целевые атрибуты в преобразовании 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>

но я не знаю, как получить атрибут «тип» и его значение в тегах «Идентификатор» для тегов 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.com. :-)   -  person LarsH    schedule 27.11.2013


Ответы (2)


но я не знаю, как получить атрибут «тип» и его значение в тегах «Идентификатор» для тегов 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