【问题标题】:Converting XML with XSLT transformation使用 XSLT 转换转换 XML
【发布时间】:2018-02-05 06:02:49
【问题描述】:

我正在尝试将 xml 转换为 xsl。 这是我的 xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<ml_root>
    <entry xmlns="http://www.w3.org/2005/Atom"
        xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
        xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
        xml:base="http://ta-nb-manill.totalamber.com:7048/DynamicsNAV90/OData/"
        m:etag="W/&quot;'28%3BDgAAAAJ7%2F0IATABVAEUAAAAAAA%3D%3D6%3B1604150%3B'&quot;">
        <id>http://ta-nb-manill.totalamber.com:7048/DynamicsNAV90/OData/Company('CRONUS%20International%20Ltd.')/Location('BLUE')
        </id>
        <category term="NAV.Location"
            scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
        <link rel="edit" title="Location"
            href="Company('CRONUS%20International%20Ltd.')/Location('BLUE')" />
        <title />
        <updated>2018-01-09T05:55:24Z</updated>
        <author>
            <name />
        </author>
        <content type="application/xml">
            <m:properties>
                <d:Code>BLUE</d:Code>
                <d:Name>Blue Warehouse</d:Name>
                <d:ETag>28;DgAAAAJ7/0IATABVAEUAAAAAAA==6;1604150;</d:ETag>
            </m:properties>
        </content>
    </entry>
</ml_root>

我尝试使用以下 XSLT 对其进行转换。

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output encoding="UTF-8" method="xml" indent="yes"/>

   <xsl:template match="/">
      <ROWS>
         <COMPANY_SITE_TAB>
            <xsl:for-each select="ml_root/entry/content/properties">
            <ROW>
               <COMPANY>TCO</COMPANY>
               <CONTRACT><xsl:value-of select="Code"/></CONTRACT>
               <COUNTRY>UNITED KINGDOM</COUNTRY>
               <DESCRIPTION><xsl:value-of select="Name"/></DESCRIPTION>
            </ROW>
            </xsl:for-each>
         </COMPANY_SITE_TAB>
      </ROWS>
   </xsl:template>
</xsl:stylesheet>

但它只给出以下输出。

<ROWS>
   <COMPANY_SITE_TAB/>
</ROWS>

你能帮我理解错误吗?

【问题讨论】:

  • XSL 是 XML 中的一种“语言”,用于指定将输入 XML 转换为某些输出的转换。您转换 XML 使用 XSL,将 XML 转换为 XSL 的用例并不多。这就像问“我正在尝试将我的工资单数据转换为 Java 程序”。给定标题,您知道 XSL 和 XSLT 的含义相同吗?你能澄清你想要达到的目标吗?您希望输入 XML 的最终输出是什么?

标签: xml xslt microsoft-dynamics-nav


【解决方案1】:

如果您仔细检查输入 XML,则会有多个名称空间(以 xmlns 开头的属性)与 XML 中的元素相关联。由于这些名称空间未在 XSLT 中映射,因此输出 XML 不显示任何数据。

对于输出 XML,从中访问数据的元素属于以下命名空间

xmlns="http://www.w3.org/2005/Atom"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"

我们还需要在 XSLT 中映射这些命名空间,并且在输出中不需要这些命名空间,我们使用 exclude-result-prefixes

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:a="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
    exclude-result-prefixes="a d m">

需要修改模板以根据元素所属的命名空间访问元素。

<xsl:for-each select="ml_root/a:entry/a:content/m:properties">

<xsl:value-of select="d:Code"/>
<xsl:value-of select="d:Name"/>

下面是完整的 XSLT。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:a="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
    exclude-result-prefixes="a d m">

    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*" />

   <xsl:template match="/">
      <ROWS>
         <COMPANY_SITE_TAB>
            <xsl:for-each select="ml_root/a:entry/a:content/m:properties">
            <ROW>
               <COMPANY>TCO</COMPANY>
               <CONTRACT><xsl:value-of select="d:Code"/></CONTRACT>
               <COUNTRY>UNITED KINGDOM</COUNTRY>
               <DESCRIPTION><xsl:value-of select="d:Name"/></DESCRIPTION>
            </ROW>
            </xsl:for-each>
         </COMPANY_SITE_TAB>
      </ROWS>
   </xsl:template>
</xsl:stylesheet>

以下是输出。

<ROWS>
    <COMPANY_SITE_TAB>
        <ROW>
            <COMPANY>TCO</COMPANY>
            <CONTRACT>BLUE</CONTRACT>
            <COUNTRY>UNITED KINGDOM</COUNTRY>
            <DESCRIPTION>Blue Warehouse</DESCRIPTION>
        </ROW>
    </COMPANY_SITE_TAB>
</ROWS>

【讨论】:

  • 请考虑我编辑了 xml 文件。但我仍然无法获得所需的输出。
  • 我已根据更新的输入 XML 更新了答案。与 &lt;m:properties&gt;&lt;d:Code&gt;&lt;d:Name&gt; 关联的不同命名空间需要在 XSLT 中进行映射。
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多