使用 XSLT 转换转换 XML
Converting XML with XSLT transformation
我正在尝试将 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/"'28%3BDgAAAAJ7%2F0IATABVAEUAAAAAAA%3D%3D6%3B1604150%3B'"">
<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>
你能帮我理解错误吗?
如果仔细检查输入 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 转换为 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/"'28%3BDgAAAAJ7%2F0IATABVAEUAAAAAAA%3D%3D6%3B1604150%3B'"">
<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>
你能帮我理解错误吗?
如果仔细检查输入 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>