首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用XSLT映射xml : CDATA阻止程序

用XSLT映射xml : CDATA阻止程序
EN

Stack Overflow用户
提问于 2018-08-28 14:48:30
回答 2查看 171关注 0票数 1

我一直试图使用XSLT从下面的xml文件中获取元素"test“的内容,但我真的被阻止了。

请您知道如何使用XSLT获得它吗?

XML文件内容如下:

代码语言:javascript
运行
复制
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <BusinessResponse>
         <BusinessResult><![CDATA[<?xml version="1.0" encoding="UTF-8"?><test>helloWorld</test>]]></BusinessResult>
      </BusinessResponse>
   </soap:Body>
</soap:Envelope>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 00:55:22

使用XSLT3.0,您可以使用parse-xml()函数将文本解析为XML,然后可以将XPath放入结构中以获得<test>元素或它的/test/text()文本节点:

代码语言:javascript
运行
复制
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">
    <xsl:sequence select="parse-xml(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult)/test"/>
  </xsl:template>

</xsl:stylesheet>

使用XSLT1.0或更高版本,如果您的内容真的那么简单,并且您只想要<test>元素中的文本节点,则可以使用substring-before()substring-after()

代码语言:javascript
运行
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">
    <xsl:value-of 
        select="substring-before(
                  substring-after(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult,
                     '&lt;test>'), 
                  '&lt;/test>')" />            
  </xsl:template>

</xsl:stylesheet>

如果您需要能够执行一些更复杂的操作,并且需要XSLT和XPath的全部功能,那么您可以通过两个转换来实现这一点。第一个转换将text()BusinessResult序列化为XML,方法是使用xsl:value-ofdisable-output-escaping="yes"

代码语言:javascript
运行
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">
    <xsl:value-of select="/soap:Envelope/soap:Body/BusinessResponse/BusinessResult" disable-output-escaping="yes" />            
  </xsl:template>

</xsl:stylesheet>

它产生:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?><test>helloWorld</test>

如果在处理SOAP信封时希望使用其他XML结构,则可能需要排除XML声明:

代码语言:javascript
运行
复制
substring-after(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult,'?>')

然后使用第二个XSLT从XML输出中选择和处理所需的内容。

票数 1
EN

Stack Overflow用户

发布于 2018-08-28 16:25:26

就像这样:

代码语言:javascript
运行
复制
<xsl:value-of select="BusinessResult" disable-output-escaping="yes"/>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52060698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档