XSLT: как анализировать HTML, встроенный в теги XML - PullRequest
0 голосов
/ 27 сентября 2018

Я сталкивался с ситуацией, когда у тега XML есть HTML-код, который необходимо проанализировать в XSLT.Вот пример XML:

<note>
    <text>&lt;p&gt;This is a paragraph.&lt;/p&gt;&lt;p&gt;This is another paragraph.&lt;/p&gt;</text>
</note>

Я хочу, чтобы внедренные элементы абзаца хранились в разных переменных.

This is a paragraph. должен храниться в одной переменной, а This is another paragraph. должен хранитьсяв другой переменной.

Можете ли вы помочь?

1 Ответ

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

Разбор XML-документов с parse-xml https://www.w3.org/TR/xpath-functions/#func-parse-xml или XML-фрагментов с parse-xml-fragment https://www.w3.org/TR/xpath-functions/#func-parse-xml-fragment поддерживается в XSLT 3.0, в более ранних версиях вам приходилось полагаться на расширение для конкретного процессора, предоставляемое или реализуемое,

Ваш экранированный код выглядит как фрагмент XHTML, поэтому его следует анализировать с parse-xml-fragment, как в https://xsltfiddle.liberty -development.net / bFDb2CQ , что делает

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

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

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="text">
      <div>
          <xsl:variable name="contents" select="parse-xml-fragment(.)"/>
          <xsl:variable name="p1" select="$contents/p[1]"/>
          <xsl:variable name="p2" select="$contents/p[2]"/>
          <xsl:sequence select="$p1, $p2"/>
      </div>
  </xsl:template>

</xsl:stylesheet>
...