XSLT-преобразование xml Элемент списка с подсписком - PullRequest
0 голосов
/ 13 февраля 2019

оценят вашу помощь.у меня есть xml следующим образом:

 <ul>
    <li>list item 1 </li>
    <li>List Item 2 
         <ul>
            <li>List item 2.1</li>
            <li>List Item 2.2</li>
        </ul>
    </li>
    <li>List Item 3 </li>
</ul>

Вывод должен быть следующим:

<list>
        <item>
            <paragraph>list item 1 </paragraph>
        </item>
        <item>
            <paragraph>List Item 2 </paragraph>
            <list>
                <item>
                    <paragraph>List<emphasis> item</emphasis> 2.1 </paragraph>
                </item>
                <item>
                    <paragraph>List Item 2.2 </paragraph>
                </item>
            </list>
        </item>
        <item>
            <paragraph>List Item 3 </paragraph>
        </item>
    </list>

Я использую xlst версии 3.0 следующим образом:

<xsl:template match="ul">
    <xsl:choose>
        <xsl:when test="name(..)='li'">
            <xsl:text disable-output-escaping="yes">&lt;/paragraph&gt;</xsl:text>
            <list>
                <xsl:apply-templates/>
            </list>
        </xsl:when>
        <xsl:otherwise>
            <list>
            <xsl:apply-templates/>
        </list></xsl:otherwise>
    </xsl:choose>
</xsl:template>
<xsl:template match="li">
    <item>
        <xsl:text disable-output-escaping="yes">&lt;paragraph&gt;</xsl:text>
        <xsl:apply-templates/>
        <xsl:text disable-output-escaping="yes">&lt;/paragraph&gt;</xsl:text>
    </item>
</xsl:template>

Iполучаю вывод почти так, как мне хотелось бы, но с дополнительным закрывающим элементом абзаца (</paragraph>) следующим образом:

<list>
              <item><paragraph>list item 1 </paragraph></item>
              <item><paragraph>List Item 2 </paragraph><list>
                          <item><paragraph>List item 2.1 </paragraph></item>
                          <item><paragraph>List Item 2.2 </paragraph></item>
                    </list>
        </paragraph></item>
              <item><paragraph>List Item 3 </paragraph></item>
        </list>

1 Ответ

0 голосов
/ 13 февраля 2019

Вам следует избегать использования disable-output-escaping таким образом.Как вы уже видели, это не очень хорошая практика.

Что вы можете сделать для данного XML, это использовать шаблон, который соответствует text(), а затем обернуть paragraph вокруг:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
  <xsl:output method="xml" indent="yes""/>

  <xsl:strip-space elements="*" />

  <xsl:template match="ul">
    <list>
      <xsl:apply-templates/>
    </list>
  </xsl:template>

  <xsl:template match="li">
    <item>
        <xsl:apply-templates/>
    </item>
  </xsl:template>

  <xsl:template match="text()">
    <paragraph>
        <xsl:value-of select="normalize-space()" />
    </paragraph>
  </xsl:template>
</xsl:stylesheet>

В качестве альтернативы, если у вас может быть разметка в вашем тексте, например, <li>list <b>item 1</b> </li>, и вы хотите выводить, например, <paragraph>list<b>item 1</b></paragraph>, тогда вы можете использовать xsl:for-each-group.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
  <xsl:output method="xml" indent="yes" />

  <xsl:strip-space elements="*" />

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="ul">
    <list>
      <xsl:apply-templates/>
    </list>
  </xsl:template>

  <xsl:template match="li">
    <item>
      <xsl:for-each-group select="node()" group-ending-with="ul">
        <paragraph>
          <xsl:apply-templates select="current-group()[not(self::ul)]" />
        </paragraph>
        <xsl:apply-templates select="current-group()[self::ul]" />
      </xsl:for-each-group>
    </item>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select="normalize-space()" />
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...