从那时起,我一直在尝试使用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>
答案 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,
'<test>'),
'</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"/>