Читать xml внутри xml с помощью xslt - PullRequest
1 голос
/ 15 июля 2009

Я получил этот XML-документ с XML-строкой, определенной внутри элемента:

<HIT>
<FIELD NAME="xmlstring">
&lt;?xml version="1.0"?&gt;
&lt;kontaktpersoner&gt;&lt;person&gt;&lt;funksjon&gt;&lt;![CDATA[Økonomi]]&gt;&lt;/funksjon&gt;&lt;tittel&gt;      &lt;![CDATA[regnskapsansv.]]&gt;&lt;/tittel&gt;&lt;email&gt;&lt;![CDATA[test@test.no]]&gt;&lt;/email&gt;&lt;navn&gt;&lt;![CDATA[Test Test]]&gt;&lt;/navn&gt;&lt;/person&gt;&lt;person&gt;&lt;funksjon&gt;&lt;![CDATA[Leder]]&gt;&lt;/funksjon&gt;&lt;tittel&gt;&lt;![CDATA[adm. dir.]]&gt;&lt;/tittel&gt;&lt;email&gt;&lt;![CDATA[test2@test.no]]&gt;&lt;/email&gt;&lt;navn&gt;&lt;![CDATA[Test2 Test]]&gt;&lt;/navn&gt;&lt;/person&gt;&lt;/kontaktpersoner&gt;
</FIELD>
</HIT>

XML внутри элемента с атрибутом "xmlstring" экранируется с &lt; и &gt; и читается как строка, а не как XML.

Как я могу использовать это с XPath в XSLT?

Ответы [ 3 ]

2 голосов
/ 15 июля 2009

Если вы можете переключать процессоры xslt, Saxon имеет функцию parse , которая позволит вам импортировать внедренный документ в переменную и обрабатывать его так же, как ваш входной документ.

1 голос
/ 15 июля 2009

XML внутри атрибута "xmlstring" экранируется с &lt; и &gt; и читается как строка, а не как XML.

Подумай об этом ... Разве не так все должно быть? Как ваш XSLT должен знать, что ваш XML содержит XML внутри XML (и что вложенный XML отсутствует даже в разделе CDATA)?

0 голосов
/ 15 июля 2009

Я не думаю, что это можно сделать за один шаг в XSLT.

Ваш единственный шанс - извлечь строку документа, разобрать ее в отдельный XML-документ и извлечь из нее.

В качестве альтернативного решения вы можете написать следующее преобразование:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="FIELD[@NAME='xmlstring']">
    <xsl:copy>
      <xsl:copy-of select="@*" />

      <!-- now this is somewhat brittle, I would not really recommend 
           it for production use, but maybe it helps nevertheless -->
      <xsl:choose>
        <xsl:when test="contains(., '&lt;?xml')">
          <xsl:value-of select="substring-after(., '?&gt;')" disable-output-escaping="yes" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="." disable-output-escaping="yes" />
        </xsl:otherwise>
      </xsl:choose>

    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

, который производит:

<HIT>
  <FIELD NAME="xmlstring">
    <kontaktpersoner>
      <person>
        <funksjon><![CDATA[Økonomi]]></funksjon>
        <tittel><![CDATA[regnskapsansv.]]></tittel>
        <email><![CDATA[test@test.no]]></email>
        <navn><![CDATA[Test Test]]></navn>
      </person>
      <person>
        <funksjon><![CDATA[Leder]]></funksjon>
        <tittel><![CDATA[adm. dir.]]></tittel>
        <email><![CDATA[test2@test.no]]></email>
        <navn><![CDATA[Test2 Test]]></navn>
      </person>
    </kontaktpersoner>
  </FIELD>
</HIT>

Который затем можно использовать как обычный документ XML на втором шаге.

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