使用XSLT对XML结果进行非实体化

使用XSLT对XML结果进行非实体化,xslt,soap,Xslt,Soap,我陷入了进退两难的境地。在特定的应用程序中,我从SOAP请求接收XML结果,如下所示: <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> <env:Header /> <env:Body> <ns1:searchResponse xmlns:ns1='http://url.to.namespace' xmlns:xsi='http://www.w3.o

我陷入了进退两难的境地。在特定的应用程序中,我从SOAP请求接收XML结果,如下所示:

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
  <env:Header />
  <env:Body>
    <ns1:searchResponse xmlns:ns1='http://url.to.namespace' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
      <ns1:result>&lt;?xml version="1.0"?&gt;&lt;results count="201" returned="201" code="200" msg="successful"&gt;&lt;result order="0"&gt;&lt;dirkey&gt;DK886shn3525&lt;/dirkey&gt;&lt;eid&gt;smith&lt;/eid&gt;&lt;email&gt;smith@me.edu&lt;/email&gt;&lt;fn&gt;Smith&lt;/fn&gt;&lt;ln&gt;Bob&lt;/ln&gt;&lt;wid&gt;859589157&lt;/wid&gt;&lt;score&gt;70&lt;/score&gt;&lt;/result&gt;&lt;result order="1"&gt;&lt;dirkey&gt;DK547fjx6702&lt;/dirkey&gt;&lt;eid&gt;james31&lt;/eid&gt;&lt;email&gt;ta@me.edu&lt;/email&gt;&lt;fn&gt;Tim&lt;/fn&gt;&lt;ln&gt;Allen&lt;/ln&gt;&lt;stu&gt;&lt;lvl&gt;Senior&lt;/lvl&gt;&lt;plans&gt;&lt;plan&gt;Technology Management-B&lt;/plan&gt;&lt;/plans&gt;&lt;contacts&gt;&lt;contact type="permanent"&gt;&lt;city&gt;Salina&lt;/city&gt;&lt;phone&gt;(123) 456-7890&lt;/phone&gt;&lt;postal&gt;67401&lt;/postal&gt;&lt;street1&gt;1111 Main Ln&lt;/street1&gt;&lt;state&gt;KS&lt;/state&gt;&lt;/contact&gt;&lt;/contacts&gt;&lt;/stu&gt;&lt;wid&gt;2222222222&lt;/wid&gt;&lt;score&gt;20&lt;/score&gt;&lt;/result&gt;</ns1:result>
    </ns1:searchResponse>
  </env:Body>
</env:Envelope>

xml version=“1.0”?results count=“201”returned=“201”code=“200”msg=“successful”result order=“0”dirkeyDK886shn3525/dirkeyeidsmith/eidemailsmith@me.edu/电子邮件fnmith/fnlnBob/lnwid859589157/widscore70/score/resultresult order=“1”dirkeyDK547fjx6702/dirkeyeidjames31/eidemailta@me.edu/电子邮件fntim/fnlallen/lnstulvlsenor/lvlplansplanTechnology Management-B/plan/planscontacts contact type=“permanent”citySalina/cityphone(123)456-7890/phonepostal67401/postalstreet11111 Main Ln/street1states/state/contact/contacts/stuwid22222/widscore20/score/result
我最感兴趣的是
元素中包含的数据。虽然这在HTML世界中可能有意义,但我需要
文本作为XML。出于对通过XSL实现这一点的可能性的兴趣,我构建了以下样式表:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:ns1="http://url.to.namespace"
  exclude-result-prefixes="env ns1">

  <xsl:output omit-xml-declaration="yes" indent="yes" method="text" />
  <xsl:strip-space elements="*"/>

  <!-- Template #1 - Identity Transform -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Template #2 - for all text() nodes, disable output escaping -->
  <xsl:template match="text()">
    <xsl:copy-of select="." disable-output-escaping="yes" />
  </xsl:template>

</xsl:stylesheet>

…从技术上讲,这确实产生了我想要的:

<?xml version="1.0"?>
<results count="201" returned="201" code="200" msg="successful">
  <result order="0">
    <dirkey>DK886shn3525</dirkey>
    <eid>smith</eid>
    <email>smith@me.edu</email>
    <fn>Bob</fn>
    <ln>Smith</ln>
    <wid>859589157</wid>
    <score>70</score>
  </result>
  <result order="1">
    <dirkey>DK547fjx6702</dirkey>
    <eid>ta</eid>
    <email>ta@me.edu</email>
    <fn>Tim</fn>
    <ln>Allen</ln>
    <stu>
      <lvl>Senior</lvl>
      <plans>
        <plan>Technology Management-B</plan>
      </plans>
      <contacts>
        <contact type="permanent">
          <city>Salina</city>
          <phone>(123) 456-7890</phone>
          <postal>67401</postal>
          <street1>1111 Main Ln</street1>
          <state>KS</state>
        </contact>
      </contacts>
    </stu>
    <wid>2222222222</wid>
    <score>20</score>
  </result>
</results>

DK886shn3525
史密斯
smith@me.edu
上下快速移动
史密斯
859589157
70
DK547fjx6702
助教
ta@me.edu
提姆
艾伦
级别高的
技术管理-B
萨利纳
(123) 456-7890
67401
1111主Ln
KS
2222222222
20
然而,我听说DOE是绝望个体的标志。事实上,当我试图通过我们的应用程序运行这个XSLT时(设计用于在将XML传递到模板引擎之前转换XML的应用程序),它不起作用。我猜DOE没有在我们特定的XSL解析器中实现

所以,这里有一个最终的问题:XSLT1.0中有没有一种方法可以在不使用特定于解析器的策略(如DOE)的情况下取消对这些实体的扫描?我的一个想法是构造一种方法,将某些转义字符(例如,
)转换为它们的字面对应(
)……但我不完全确定我将如何实现这一点

一如既往,我感谢你的帮助

请注意,不要麻烦告诉我这个输出有多恶心,或者他们是如何破坏文档结构的;我们已经试图让他们改变它,但这不是一个选项(

所以,这里有一个终极问题:XSLT1.0中有没有一种方法可以 不使用特定于解析器的策略(如 DOE?我的一个想法是构造一种方法来翻译某些 将转义字符(例如>)转换为其文本对应项 (>)…但我不完全确定我会怎么做

在XSLT 3.0(仍然是W3C的工作草案)提供标准函数之前,没有一种纯粹的XSLT方法来重建被破坏的标记

在XSLT 3.0可用之前,重建已销毁标记的安全方法是调用一个具有类似签名的扩展函数,该签名必须由您自己编写

此扩展函数将尝试将其字符串参数解析为
XmlDocument
的实例,如果成功,则返回结果