XSLT Выбор и объединение узлов на основе контента - PullRequest
0 голосов
/ 28 января 2019

Извините, если подобный вопрос уже задавался, я новичок в xsl и не смог найти подходящий ответ.

Я пытаюсь преобразовать XML в другой файл XML.Проблема в том, что во входном xml единственные узлы, которые у меня есть, это <p> элементы.Я должен взять текстовое содержимое этих элементов, сделать из них новые узлы и объединить некоторые другие с новыми узлами.Вторая проблема заключается в том, что во входном xml нет реальной согласованности.Я действительно в тупик.

(входной XML-код, над которым я работаю, длиннее, чем приведенный пример, но он следует той же схеме: один div с классом страницы и два содержимого и параграфы на div)

входной xml:

<root>
    <div class="page">
        <p>Content:</p>
        <p>This is the content. </p>
        <p>Content continues. </p>
        <p>End content.</p>
        <p>Paragraph:</p>
        <p>◼ Beginning of new paragraph. </p>
        <p>End of new paragraph.</p>
        <p>◼ New line here.</p>
        <p>Content:</p>
        <p>Heres lies the second content </p>
        <p>Continiuation of the second content. </p>
        <p>Second content ends.</p>
        <p>Paragraph:</p>
        <p>◼ Start of second paragraph. </p>
        <p>Finish of second paragraph.</p>
        <p>◼ This should also be separate.</p>
    </div>
    <div class="page">
        <p>Content:</p>
        <p>Third content starts here. </p>
        <p>Third content continues. </p>
        <p>End content three.</p>
        <p>Paragraph:</p>
        <p>◼ Beginning of third paragraph. </p>
        <p>End of third paragraph.</p>
        <p>◼ And again a new line.</p>
    </div>
</root>

Вывод, который я пытаюсь получить, таков:

<root>
    <page>
        <title>Content:<title>
        <content>This is the content. Content continues. End content.<content>
        <paragraph>Paragraph:<paragraph>
        <pcontent>◼ Beginning of new Paragraph. End of new Paragraph.</pcontent>
        <pcontent>◼ New line here.</pcontent>
        <title>Content:<title>
        <content>This is the second content. Second content continues. End content two.<content>
        <paragraph>Paragraph:<paragraph>
        <pcontent>◼ Beginning of second Paragraph. End of second Paragraph.</pcontent>
        <pcontent>◼ This should also be separate.</pcontent>
    </page>
    <page>
        <title>Content:<title>
        <content>This is the third content. Third content continues. End content three.<content>
        <paragraph>Paragraph:<paragraph>
        <pcontent>◼ Beginning of third Paragraph. End of third Paragraph.</pcontent>
        <pcontent>◼ And again a new line.</pcontent>
    </page> 
</root>

1 Ответ

0 голосов
/ 28 января 2019

Я не уверен в точной требуемой логике, но вы, вероятно, хотите использовать xsl:for-each-group здесь.

Итак, начните с выбора элементов p, сгруппировав их по тем, которые заканчиваются надвоеточие

<xsl:for-each-group select="p" group-starting-with="p[ends-with(., ':')]">

Затем вы можете обработать группу, используя current-group().Тем не менее, для абзацев требуется больше работы, так как вам нужно вложенное xsl:for-each для обработки тех, которые начинаются с этого забавного символа.

<xsl:for-each-group select="current-group() except ." group-starting-with="p[starts-with(., '◼')]">

Попробуйте этот XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="div[@class='page']">
    <page>
      <xsl:for-each-group select="p" group-starting-with="p[ends-with(., ':')]">
        <xsl:choose>
          <xsl:when test=". = 'Content:'">
            <title><xsl:value-of select="." /></title>
            <content>
              <xsl:value-of select="current-group() except ." separator="" />
            </content>
          </xsl:when>
          <xsl:when test=". = 'Paragraph:'">
            <paragraph><xsl:value-of select="." /></paragraph>
            <xsl:for-each-group select="current-group() except ." group-starting-with="p[starts-with(., '◼')]">
              <pcontent>
                <xsl:value-of select="current-group()" separator="" />
              </pcontent>
            </xsl:for-each-group>
          </xsl:when>
        </xsl:choose>
      </xsl:for-each-group>
    </page>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...