используйте xslt для добавления новых строк после атрибутов - PullRequest
3 голосов
/ 06 декабря 2011

Я пытаюсь преобразовать XML, который выглядит следующим образом:

<item attr1="value1" attr2="value2"><nestedItem attr1="value1" attr="value2"/></item>

В XML, который выглядит следующим образом:

<item 
   attr1="value1" 
   attr2="value2">
   <nestedItem 
     attr1="value1" 
     attr="value2"/>
</item>

Я работаю с таблицей стилей:

 <xsl:output method="xml" encoding="UTF-8" indent="yes" />
 <xsl:strip-space elements="*"/>

 <xsl:template name="newline">
   <xsl:text disable-output-escaping="yes">
   </xsl:text>
 </xsl:param>

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

 <xsl:template match="@*">
   <xsl:attribute name="{name(.)}">
     <xsl:value-of select="."/>
   </xsl:attribute> 
 </xsl:template>
</xsl:stylesheet>

Я пытался вызвать мой шаблон newline из нескольких разных мест, но не могу вставить переводы строк между моими атрибутами.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

В XSLT 1.0 и 2.0 не поддерживается требуемая сериализация (и, насколько мне известно, также в готовящемся XSLT 3.0).

Если ваш XSLT-процессор разрешает сериализацию через предоставленный пользователем класс XmlWriter, вы можете реализовать такую ​​сериализацию.

Например, при использовании одной или нескольких конкретных перегрузок метода .NET XslCompiledTransform.Transform() можно передать в качестве одного из аргументов методу, экземпляр XmlWriter. Передайте экземпляр вашего собственного класса, производный от XmlWriter.

1 голос
/ 30 мая 2012

Следующий шаблон может быть не очень красивым и не лучшим вариантом, но он работает для меня.Попробуйте.Он не будет выводить атрибуты xmlns, если они есть в элементе.

    <xsl:template match="*">
    <xsl:text disable-output-escaping="yes">&lt;</xsl:text><xsl:value-of select="name()"/><xsl:text>&#xd;</xsl:text>
    <xsl:for-each select="@*">
        <xsl:text>&#x9;</xsl:text><xsl:value-of select="concat(name(),'=' ,'&#x22;', . ,'&#x22;')" /><xsl:text>&#xd;</xsl:text>
    </xsl:for-each>
    <xsl:text disable-output-escaping="yes">&gt;&#xd;</xsl:text>
    <xsl:apply-templates/>
    <xsl:text disable-output-escaping="yes">&lt;/</xsl:text><xsl:value-of select="name()"/><xsl:text disable-output-escaping="yes">&gt;&#xd;</xsl:text>
</xsl:template>
0 голосов
/ 06 декабря 2011

Когда вы используете сериализатор Saxon с отступом, вы можете получить вывод, близкий к тому, что вы ищете, но он может быть не совсем тем, что вы хотите. Если вы действительно суетитесь по поводу формата, то вам придется написать свой собственный сериализатор или адаптировать существующий путем настройки кода. Обычная философия в кругах XML заключается в том, что на самом деле вам не нужно заботиться о различиях, которые будут игнорироваться после анализа данных, включая такие вещи, как выбор символа кавычки, порядок атрибутов и пробел, разделяющий атрибуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...