如何使用XSLT应用于其他XML来创建命名空间XML

时间:2016-01-13 18:37:32

标签: xml xslt

我有以下XML文件,我将转换为另一个XML文件:

<Report>
  <MessageDetails>
    <MessageGeneratedOn>2016-01-13T17:56:22</MessageGeneratedOn>
    <ReportingPeriod>2016-12-31</ReportingPeriod>
  </MessageDetails>
  <Reporting1>
    <OrganizationName>API Guernsey Limited</OrganizationName>
    <DistrictName>Windsor</DistrictName>
    <City>Corres</City>
  </Reporting1>
</Report>

我应用以下XSLT进行转换:

<?xml version="1.0" encoding="UTF-8"?>
<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:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Report">
    <FATCA_OECD version="1.1" schemaLocation="urn:oecd:ties:fatca:v1 FatcaXML_v1.1.xsd" >
      <xsl:element name ="ReportingPeriod">
        <xsl:value-of select="MessageDetails/ReportingPeriod"/>
      </xsl:element>

      <xsl:element name ="Timestamp">
        <xsl:value-of select="MessageDetails/MessageGeneratedOn"/>
      </xsl:element>
      <Reporting1>

        <xsl:element name ="Name">
          <xsl:value-of select="ReportingFI/Name"/>
        </xsl:element>

        <Address>
          <xsl:element name ="DistrictName">
            <xsl:value-of select="ReportingFI/Address2"/>
          </xsl:element>
          <xsl:element name ="City">
            <xsl:value-of select="ReportingFI/City"/>
          </xsl:element>
        </Address>
      </Reporting1>

    </FATCA_OECD>
  </xsl:template>


</xsl:stylesheet>

这将创建以下XML:

<FATCA_OECD version="1.1" schemaLocation="urn:oecd:ties:fatca:v1 FatcaXML_v1.1.xsd">
  <MessageSpec>
    <ReportingPeriod>2016-12-31</ReportingPeriod>
    <XMLTimeStamp>2016-01-13T17:56:22</XMLTimeStamp>
  </MessageSpec>
  <FATCA>
    <Reporting1>
      <Address>
        <DistrictName></DistrictName>
        <City>Corres</City>
      </Address>
    </Reporting1>
    <ReportingGroup />
  </FATCA>
</FATCA_OECD>

但我需要带命名空间的XML。如何使用如下命名空间创建XML?:

<ftc:FATCA_OECD version="1.1" schemaLocation="urn:oecd:ties:fatca:v1 FatcaXML_v1.1.xsd">
  <ftc:MessageSpec>
    <sfa:ReportingPeriod>2016-12-31</sfa:ReportingPeriod>
    <sfa:XMLTimeStamp>2016-01-13T17:56:22</sfa:XMLTimeStamp>
  </ftc:MessageSpec>
  <ftc:FATCA>
    <ftc:Reporting1>
      <sfa:Address>
        <sfa:DistrictName></sfa:DistrictName>
        <sfa:City>Corres</sfa:City>
      </sfa:Address>
    </Reporting1>
      <ftc:ReportingGroup />
  </ftc:FATCA>

</ftc:FATCA_OECD>

感谢。

1 个答案:

答案 0 :(得分:1)

在样式表中,向xmlns:fatcav1="urn:oecd:ties:fatca:v1"元素添加xsl:stylesheet属性,这意味着您声明对fatcav1前缀的任何引用都意味着您使用URI {{引用命名空间1}}。现在,对于所有您在XSLT中生成的元素,在其前面添加urn:oecd:ties:fatca:v1(例如fatcav1),这意味着您正在创建<fatcav1:FATCA_OECD ...元素< em>在与FATCA_OECD前缀关联的命名空间中。确保将此前缀添加到所有元素

还有其他方法可以实现相同的目标,但这是一种很好的方法,可以让任何查看XSLT代码的人明白您正在从该特定命名空间创建XML元素。 您可以选择任何您喜欢的前缀(例如您在示例中使用的fatcav1)。真正重要的是名称空间URI和元素名称。我通常会尝试使前缀有点“说”,这样读者就可以更好地弄清楚命名空间的含义。