【问题标题】:XSLT Transformation from XML PCDATA to XML从 XML PCDATA 到 XML 的 XSLT 转换
【发布时间】:2017-06-02 13:09:45
【问题描述】:

我需要将 XML 中的 PCDATA 转换为另一个 XML。谁能帮我解决这个问题?

我需要将请求中的业务线、站点位置和政策编号映射到相应的字段以作为响应。

包含 PCDATA 的输入 XML 是转义的 XML:

<ns2:Response xmlns:ns2="http://webservices.company.com/">
    <return>&lt;ibdoc&gt;&lt;result lob='15' env_def='SR_JBOSS_DEV' gen_date='2017-01-18 12:11:30 AM' ibdoc_version='3.1' engine_type='JBoss' site_location='S396AT092'&gt;
    &lt;program parent_id='1001' program_id='1' program_ver='1' package_date='2017-01-05T13:06:01' status='PASS' gen_type='0' region_format='en-US' from_cache='true'&gt;
        &lt;c i='0' d='Policy'&gt;
            &lt;m i='POLICY NUMBER' d='POLICY NUMBER' v='1000001'/&gt;
        &lt;/c&gt;
    &lt;/program&gt;
    &lt;stats&gt;
        &lt;start_time&gt;2017-01-18 12:11:30:0191 AM&lt;/start_time&gt;
        &lt;stop_time&gt;2017-01-18 12:11:30:0226 AM&lt;/stop_time&gt;
        &lt;running_time&gt;35&lt;/running_time&gt;
        &lt;xml_walking&gt;31&lt;/xml_walking&gt;
    &lt;/stats&gt;
&lt;/result&gt;&lt;/ibdoc&gt;</return>
</ns2:Response>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <ns2:custom-response xmlns:ns2="http://esbservices.company.com/">
        </ns2:custom-response>
    </xsl:template>
</xsl:stylesheet>

预期输出 XML:

<ns2:custom-response xmlns:ns2="http://esbservices.company.com/">
    <line-of-business>15</line-of-business>
    <site>S396AT092</site>
    <policy>
        <policy-nr>1000001</policy-nr>
    </policy>
</ns2:custom-response>

【问题讨论】:

  • 哪个 CDATA 部分?您的输入 XML 中没有
  • 嗨 Thomas,返回标签内的内容是 CDATA 部分 正在转换为 <和>分别。我知道根据链接soapui.org/functional-testing/working-with-cdata.html,它是有效的cdata部分
  • 恕我直言,那是 PCDATA,因为 P 代表 parsed。必须解析该文本以替换实体。见stackoverflow.com/a/11624583/480982
  • 好的,你现在得到了我的支持。像这样,问题似乎完成了。
  • 您可以使用哪种 XSLT 处理器? Saxon 9 或 Altova 的最新版本支持 XPath 3.0 函数 parse-xml w3.org/TR/xpath-functions-30/#func-parse-xml,它允许您将带有 XML 的字符串解析为文档,然后您可以像往常一样编写模板来转换它。

标签: xml xslt xslt-2.0


【解决方案1】:

使用 XSLT 3.0 和 XPath 3.0 parse-xml 函数(在 Saxon 9、Altova XMLSpy、oXygen 中支持),您可以使用

<xsl:template match="/*">
    <ns2:custom-response xmlns:ns2="http://esbservices.company.com/">
        <xsl:variable name="return-doc" select="parse-xml(return)"/>
        <xsl:apply-templates select="$return-doc/ibdoc/result"/>
    </ns2:custom-response>        
</xsl:template>

<xsl:template match="result">
    <line-of-business>
        <xsl:value-of select="@lob"/>
    </line-of-business>
    <site>
        <xsl:value-of select="@site_location"/>
    </site>
    <policy>
        <policy-nr>
            <xsl:value-of select=".//c[@d = 'Policy']/m[@d = 'POLICY NUMBER']/@v"/>
        </policy-nr>
    </policy>   
</xsl:template>

【讨论】:

  • 嗨 Martin,我使用的是 XSLT 2.0。函数 parse-xml 是否可用?
  • 如果设置version="3.0",则在 Saxon 9.7 中可用,而不是在 2.0 中。
  • 不幸的是我只能使用 xslt 1.0 或 2.0。有没有其他方法可以实现它。
  • 检查 XSLT 2.0 处理器的文档是否提供扩展,例如 saxonica.com/html/documentation/functions/saxon/parse.html
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多