【问题标题】:How to create namespace XML using XSLT applying on other XML如何使用应用于其他 XML 的 XSLT 创建命名空间 XML
【发布时间】:2016-01-13 18:37:32
【问题描述】:

我有以下 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>

谢谢。

【问题讨论】:

  • 您的预期输出是仍然没有命名空间的文档,它只有前缀名称,但缺少命名空间声明
  • 澄清一下:您的预期输出不是格式良好的 XML,并且不能作为 XSL 转换的结果生成。如果不将前缀绑定到命名空间 (URL),则无法使用前缀。

标签: xml xslt


【解决方案1】:

在您的样式表中,将xmlns:fatcav1="urn:oecd:ties:fatca:v1" 属性添加到xsl:stylesheet 元素,这意味着您声明对fatcav1 前缀的任何引用意味着您正在使用URI urn:oecd:ties:fatca:v1 引用命名空间。现在对于您在 XSLT 中生成的所有元素,为它们添加前缀fatcav1(例如&lt;fatcav1:FATCA_OECD ...),这意味着您正在关联的命名空间中创建一个FATCA_OECD 元素带有fatcav1 前缀。确保将此前缀添加到所有元素

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

【讨论】:

  • 嗨,dret,我得到了预期的输出。非常感谢您的帮助。
猜你喜欢
  • 2011-03-17
  • 2010-12-16
  • 2018-02-08
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2015-05-26
相关资源
最近更新 更多