我有一个带有XML字符串的XML
<?xml version="1.0" encoding="UTF-8"?><body xmlns:ns0="http://www.ibm.com/websphere/sibx/ServiceGateway" xmlns:ns1="http://com.ibm.websphere.jms.data.bindings/schema">
<ns0:JMSTextBody_element>
<ns1:value><delivery gduid="6395" sduid="2392">
<object type="issue" id="C0.ISS.1451" alt_id="BBG000BH7B07">
<attributes>
<simple id="bb_global_id" changed="true">BBG000BH7B07</simple>
<simple id="dv_source1" changed="true">BB</simple>
<simple id="nominal_value" changed="true">0.1</simple>
</attributes>
</object>
</delivery></ns1:value>
</ns0:JMSTextBody_element>
</body>
我需要从内联XML重新格式化中获取值并创建一个新的XML字符串
<?xml version="1.0" encoding="UTF-8"?><body xmlns:ns0="http://www.ibm.com/websphere/sibx/ServiceGateway" xmlns:ns1="http://com.ibm.websphere.jms.data.bindings/schema">
<ns0:JMSTextBody_element>
<ns1:value>
<ac_connect_type>issue</ac_connect_type><ac_connect_id>C0.ISS.1451</ac_connect_id><ac_connect_alt_id>BBG000BH7B07</ac_connect_alt_id><bb_global_id>BBG000BH7B07</bb_global_id>
<dv_source1>BB</dv_source1><nominal_value>0.1</nominal_value></ns1:value>
</ns0:JMSTextBody_element>
</body>
我无法访问内联XML中的元素
<xsl:apply-templates select="/delivery/object/attributes/bb_global_id" />
似乎不起作用,显然我在这里遗漏了一些东西 感谢
答案 0 :(得分:1)
假设Saxon 9.6和XSLT 3.0可以使用
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://com.ibm.websphere.jms.data.bindings/schema"
exclude-result-prefixes="xs">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* , node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns1:value">
<xsl:copy>
<xsl:apply-templates select="parse-xml(.)//object"/>
</xsl:copy>
</xsl:template>
<xsl:template match="object">
<xsl:apply-templates select="@* , attributes/simple"/>
</xsl:template>
<xsl:template match="object/@*">
<xsl:element name="ac_connect_{local-name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="simple">
<xsl:element name="{@id}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
创建输出
<?xml version="1.0" encoding="UTF-8"?>
<body xmlns:ns0="http://www.ibm.com/websphere/sibx/ServiceGateway"
xmlns:ns1="http://com.ibm.websphere.jms.data.bindings/schema">
<ns0:JMSTextBody_element>
<ns1:value>
<ac_connect_type>issue</ac_connect_type>
<ac_connect_id>C0.ISS.1451</ac_connect_id>
<ac_connect_alt_id>BBG000BH7B07</ac_connect_alt_id>
<bb_global_id>BBG000BH7B07</bb_global_id>
<dv_source1>BB</dv_source1>
<nominal_value>0.1</nominal_value>
</ns1:value>
</ns0:JMSTextBody_element>
</body>
答案 1 :(得分:0)
显然我在这里遗漏了一些东西
似乎你错过了ns1:value
中的转义XML只是一个无意义的字符串,并且无法使用XPath解决的事实。
“正确”的解决方案是在两次通过中进行转换。在第一遍中,使用:
<强> XSLT 强>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://www.ibm.com/websphere/sibx/ServiceGateway" xmlns:ns1="http://com.ibm.websphere.jms.data.bindings/schema">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/body">
<xsl:value-of select="ns0:JMSTextBody_element/ns1:value" disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>
将此转换的结果保存到文件中,然后使用另一个样式表将另一个转换应用于该文件。
或者,您可以尝试使用字符串函数从转义字符串中提取所需信息 - 这很笨拙且容易出错。