XSLT - ›Отсутствуют пробелы между атрибутами.

Со вчерашнего дня я экспериментирую с XSLT и после долгих усилий смог заставить свое задание работать. Это состоит в том, чтобы взять некоторые элементы, которые находятся в узле «ATTRIBUTE», и преобразовать их в атрибуты родительского элемента (которые, кстати, могут иметь разные имена). Это пример того, что мне нужно сделать:

Отсюда ->

<INVENTORY>
  <ITEM>
    <ATTRIBUTES>
      <SERIALNUMBER>something1</SERIALNUMBER>
      <LOCATION>something2</LOCATION>
      <BARCODE>something3</BARCODE>
    </ATTRIBUTES>
  Some Item Value
  </ITEM>
</INVENTORY>

Сюда ->

<INVENTORY>
    <ITEM SERIALNUMBER="something1" LOCATION="something2" BARCODE="something3">
    SomeItemValue
    </ITEM>
</INVENTORY>

Однако, как это ни странно, я получаю атрибуты в родительском узле, но без каких-либо разделений и пробелов. Я пробовал несколько, несколько вещей, но, похоже, ни один из них не помог.

Это шаблон XSLT, который я использую для преобразования:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output encoding="us-ascii"/>

    <xsl:template match="@*|node()">

        <xsl:copy>
            <xsl:if test="ATTRIBUTES">

                <xsl:for-each select="ATTRIBUTES/*">
                    <xsl:attribute name="{name()}" separator=" ">
                        <xsl:value-of select="." />
                    </xsl:attribute>
                </xsl:for-each>

            </xsl:if>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>

    </xsl:template>

    <xsl:template match="ATTRIBUTES">
    </xsl:template>

</xsl:stylesheet>

Результат, который я получаю, следующий:

<?xmlversion="1.0"encoding="us-ascii"?><INVENTORY><ITEMSERIALNUMBER="something1"LOCATION="something2"BARCODE="something3">SomeItemValue</ITEM></INVENTORY>

Однако, если попытаться поместить <xml:text> </xml:text> внутри xsl:for-each, я сразу перестану видеть атрибуты вместо того, чтобы получать пробелы.

Любая помощь приветствуется!


person user3483969    schedule 01.04.2014    source источник


Ответы (1)


Он отлично работает для меня в MS Visual Studio 2013 даже с недопустимым разделителем атрибутов в шаблоне xslt.

Попробуй это

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output encoding="us-ascii" indent="yes" method="xml"/>

  <xsl:template match="@*|node()">

    <xsl:copy>
      <xsl:if test="ATTRIBUTES">

        <xsl:for-each select="ATTRIBUTES/*">
          <xsl:attribute name="{name()}">
            <xsl:value-of select="." />
          </xsl:attribute>
        </xsl:for-each>

      </xsl:if>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>

  </xsl:template>


  <xsl:template match="ATTRIBUTES">
  </xsl:template>

</xsl:stylesheet>

Измененный:

<xsl:output encoding="us-ascii" indent="yes" method="xml"/>
<xsl:attribute name="{name()}">
person Jaroslav Kubacek    schedule 01.04.2014
comment
Спасибо Ярославу. Фактически, я перепроверил весь код, и с преобразованием все оказалось не так. Заготовки удалялись каким-то другим способом. Спасибо за помощь - person user3483969; 01.04.2014