使用XSLT 2.0解析xml字符串

时间:2015-08-04 13:53:46

标签: xml xslt xpath

我有一个带有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>&lt;delivery gduid="6395" sduid="2392"&gt;&#13;
    &lt;object type="issue" id="C0.ISS.1451" alt_id="BBG000BH7B07"&gt;&#13;
        &lt;attributes&gt;&#13;
            &lt;simple id="bb_global_id" changed="true"&gt;BBG000BH7B07&lt;/simple&gt;&#13;
            &lt;simple id="dv_source1" changed="true"&gt;BB&lt;/simple&gt;&#13;
            &lt;simple id="nominal_value" changed="true"&gt;0.1&lt;/simple&gt;&#13;
        &lt;/attributes&gt;&#13;
    &lt;/object&gt;&#13;
&lt;/delivery&gt;</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" />

似乎不起作用,显然我在这里遗漏了一些东西 感谢

2 个答案:

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

将此转换的结果保存到文件中,然后使用另一个样式表将另一个转换应用于该文件。

或者,您可以尝试使用字符串函数从转义字符串中提取所需信息 - 这很笨拙且容易出错。