在转换xml时处理命名空间问题

时间:2013-08-12 14:14:08

标签: xslt namespaces

我可以根据我的要求使用以下xml作为输入来转换xml。

<message
    xmlns="http://www.origoservices.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
  <m_control>
    <control_timestamp>2013-06-06T14:55:37</control_timestamp>
    <initiator_id>ASL</initiator_id>
  </m_control>
  <m_content>
    <b_control>
      <quote_type>Single Company</quote_type>
      <quote_or_print>Quote And Print</quote_or_print>
      <generic_quote_ind>Yes</generic_quote_ind>
      <tpsdata>
        <tps_quote_type>Comparison</tps_quote_type>
      </tpsdata>
    </b_control>
    <application>
      <product>
        <tpsdata>
          <service_type>QuickQuote</service_type>
          <quote_type>Standard</quote_type>
        </tpsdata>
      </product>
    </application>
  </m_content>
</message>

但问题是,有时输入XML将包含对Namespace的引用作为每个元素的前缀。如下面的每个元素的名称空间前缀'ns2'下面的xml所示.Below是带有'ns2'命名空间的xml前缀。在这种情况下,我的xslt失败并且无法执行转换。任何人都可以帮助我理解如何在xslt中处理这个命名空间问题,以便有和没有命名空间前缀的xml可以被相同的xslt转换?

<ns2:message xmlns:ns2="http://www.origoservices.com"
  xmlns="http://www.w3.org/2000/09/xmldsig#"
>
  <ns2:m_control>
    <ns2:control_timestamp>2013-06-06T14:55:37</ns2:control_timestamp>
    <ns2:initiator_id>ASL</ns2:initiator_id>
  </ns2:m_control>
  <ns2:m_content>
    <ns2:b_control>
      <ns2:quote_type>Single Company</ns2:quote_type>
      <ns2:quote_or_print>Quote And Print</ns2:quote_or_print>
      <ns2:generic_quote_ind>Yes</ns2:generic_quote_ind>
      <ns2:quote_response_status>Error</ns2:quote_response_status>
<ns2:tpsdata>
<ns2:tps_quote_type
xmlns="http://www.origoservices.com"
xmlns:ns2="http://www.w3.org/2000/09/xmldsig#"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>Comparison</ns2:tps_quote_type>
</ns2:tpsdata>


    </ns2:b_control>
    <ns2:application>
      <ns2:product>
        <ns2:tpsdata>
          <ns2:service_type>QuickQuote</ns2:service_type>
          <ns2:quote_type>Standard</ns2:quote_type>
        </ns2:tpsdata>
      </ns2:product>
    </ns2:application>
  </ns2:m_content>
</ns2:message>

我在xslt以下使用。

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:o="http://www.origoservices.com"
    xmlns:dp="http://www.datapower.com/extensions"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:date="http://exslt.org/dates-and-times"
    extension-element-prefixes="dp"
    exclude-result-prefixes="fn date">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="o:b_control/o:quote_type[../o:tpsdata/o:tps_quote_type = 'Comparison']">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:text>Comparison</xsl:text>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="o:tpsdata[o:tps_quote_type = 'Comparison']" />
</xsl:stylesheet>

如果需要更多信息,请与我们联系。

此致 拉胡

1 个答案:

答案 0 :(得分:0)

在此论坛上进行了所有讨论后,我的问题已得到解决。下面是更正的xslt来处理我面临的命名空间问题。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:o="http://www.origoservices.com" xmlns:dp="http://www.datapower.com/extensions" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:date="http://exslt.org/dates-and-times" xmlns:g="http://www.w3.org/2000/09/xmldsig#" version="1.0" extension-element-prefixes="dp" exclude-result-prefixes="fn date">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
    <xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="o:b_control/o:quote_type[../o:tpsdata/g:tps_quote_type = 'Comparison']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:text>Comparison</xsl:text>
</xsl:copy>
</xsl:template>
<xsl:template match="o:tpsdata[g:tps_quote_type = 'Comparison']"/>
<xsl:template match="o:b_control/o:quote_type[../o:tpsdata/o:tps_quote_type = 'Comparison']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:text>Comparison</xsl:text>
</xsl:copy>
</xsl:template>
<xsl:template match="o:tpsdata[o:tps_quote_type = 'Comparison']"/>
</xsl:stylesheet>