使用xslt读取xml中的xml

使用xslt读取xml中的xml,xml,xslt,xpath,Xml,Xslt,Xpath,我得到了这个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;&

我得到了这个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 version=“1.0”?
康塔克普森潘克松![CDATA[Økonomi]]/funkschontittel![CDATA[regnskapsansv.]/tittelemail![CDATA[test@test.no]]/电子邮件导航![CDATA[测试]]/navn/PersonFunksjon![CDATA[Leder]]/Funksjontitel![CDATA[adm.dir.]/tittelemail![CDATA[test2@test.no]]/电子邮件导航![CDATA[Test2测试]]/navn/person/kontaktpersoner
带有
“xmlstring”
属性的元素中的XML用
转义,并作为字符串而不是XML读取

如何在XSLT中使用XPath

“xmlstring”属性中的XML用
转义,并作为字符串而不是XML读取


想想看。。。事情不正是这样吗?您的XSLT如何知道您的XML在XML中包含XML(而嵌套的XML甚至不在
CDATA
节中)?

我认为这不能在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文档一样使用。

如果您可以切换xslt处理器,Saxon有一个函数,允许您使用将嵌入的文档导入变量并像处理输入文档一样处理它。

我不认为“属性”在您的问题中,是指FIELD元素的NAME属性,但是它指的是什么呢?你能澄清你的问题吗?此外,XML中间的XML处理指令要么是完全无效的,要么至少是非常奇怪的。根据XML规范,它应该出现在开头,并且必须出现在其他内容之前。这是无效的XML。XML声明必须从开头开始。实际上,它根本不是XML。@John:实际上,它代表一个XML字符串。我想你误解了OP的问题。