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

时间:2018-08-28 14:48:31

标签: xml xslt

从那时起,我一直在尝试使用XSLT从以下xml文件中获取元素“ test”的内容,但我确实受到了封锁。

请问您如何使用XSLT进行获取

XML文件的内容如下:

<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>

2 个答案:

答案 0 :(得分:1)

使用 XSLT 3.0 ,您可以使用parse-xml()函数将文本解析为XML,然后可以将XPath放入结构中以获取<test>元素或{ {1}}文本节点:

/test/text()

XSLT 1.0 或更高版本中,如果您的内容确实如此简单,并且只需要<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> 元素内的文本节点,则可以使用<test>substring-before()

substring-after()

如果您需要能够执行更复杂的操作并且需要XSLT和XPath的全部功能,则可以通过两次转换来实现。通过将<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> text()一起使用来将BusinessResult的{​​{1}}序列化为XML的第一次转换:

xsl:value-of

哪个会产生:

disable-output-escaping="yes"

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

<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>

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

答案 1 :(得分:0)

尝试这样:

<xsl:value-of select="BusinessResult" disable-output-escaping="yes"/>