XSLT Как создать теги XML из данных форматированного текста - PullRequest
0 голосов
/ 06 сентября 2018

Я использую xsl для преобразования xml в xml. Не могли бы вы помочь мне написать XSL-код для преобразования ввода в вывод?

С учетом ввода:

    <ATTRIBUTE-VALUE>
    <THE-VALUE>
        <div xmlns="http://www.w3.org/1999/xhtml">
            <h1 dir="ltr" id="_1536217498885">Main Description</h1>
            <p>The main description text goes here.</p>
            <h1 dir="ltr" id="_1536217498886">Key Consideration</h1>
            <p>The key consideration text goes here.</p>
            <h1 dir="ltr" id="_1536217498887">Skills</h1>
            <p>The Skills text goes here.</p>
            <h1 dir="ltr" id="_1536217498888">Synonyms</h1>
            <p>The Synonyms text goes here.</p>
        </div>
    </THE-VALUE>
</ATTRIBUTE-VALUE>

Ожидаемый результат:

<MainDescription><![CDATA[The main description text goes here.]]></MainDescription>
<KeyConsiderations><![CDATA[The key consideration text goes here.]]></KeyConsiderations>
<Skills>The skills text goes here.</Skills>
<Synonyms>The synonyms text goes here.</Synonyms>

1 Ответ

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

Попробуйте следующее (с префиксом 'x', связанным с пространством имен xhtml)

<xsl:template match="THE-VALUE/x:div">
<xsl:for-each-group select="*" group-starting-with="x:h1">
  <xsl:element name="{translate(current-group()[1], ' ', '')}">
    <xsl:value-of select="current-group()[2]"/>
  </xsl:element>
</xsl:for-each-group>
</xsl:template> 

На самом деле для этого не требуется группировка: вы также можете сделать <xsl:for-each select="h1">, а затем сослаться на два элемента в группе как . и following-sibling::p[1] соответственно. То есть:

  <xsl:template match="THE-VALUE/x:div">
    <xsl:for-each select="x:h1">
      <xsl:element name="{translate(., ' ', '')}">
        <xsl:value-of select="following-sibling::*[1]"/>
      </xsl:element>
    </xsl:for-eac>
  </xsl:template> 

Последнее решение будет работать в XSLT 1.0.

...