xslt: добавление дочернего элемента в форматирование руин xsltproc - PullRequest
0 голосов
/ 06 сентября 2018

Рассмотрим bla.xml:

<?xml version="1.0" encoding="UTF-8"?>
<rooty>
  <person>
    <age>42</age>
    <name>bob</name>
  </person>
  <person>
    <age>53</age>
    <name>doggo</name>
  </person>
</rooty>

И преобразуйте moo.xslt, добавляя к каждому человеку корову:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes" encoding="UTF-8"/>

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

  <xsl:template match="person">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:copy-of select="node()"/>
      <cow>Bessy</cow>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Запуск с xsltproc moo.xslt bla.xml, кажется, пропускает символ новой строки (после cow):

<?xml version="1.0" encoding="UTF-8"?>
<rooty>
  <person>
    <age>42</age>
    <name>bob</name>
  <cow>Bessy</cow></person>
  <person>
    <age>53</age>
    <name>doggo</name>
  <cow>Bessy</cow></person>
</rooty>

Мне удалось обойти это, вручную вводя пробелы, используя такие вещи, как <xsl:text>&#xA; </xsl:text>, но я уверен, что это не так. Я предполагаю, что мой XSLT делает что-то глупое, но я не могу понять, что.

1 Ответ

0 голосов
/ 06 сентября 2018

Если нет смешанного содержимого (элементы с текстовым узлом, а также дочерние элементы, что не так в вашем примере ввода), я обнаружил, что xsl:output indent="yes" лучше всего работает с <xsl:strip-space elements="*"/>, чтобы дать последовательный отступ.

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