XML 元素名称中包含的 XSLT 名称空间 URI
XLST Namespace URI included in XML element name
所以我在样式表中声明了我的命名空间,如下所示
<xmlns:address="http://base.google.com/ns/1.0"
下面是我的整个 XSLT 转换模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:address="http://base.google.com/ns/1.0" exclude-result-prefixes="address">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="success"/>
<xsl:template match="paging"/>
<xsl:template match="orders">
<xsl:element name="Items" >
<xsl:for-each select="order">
<xsl:element name="item">
<xsl:element name="entity_id">
<xsl:value-of select="order_no"/>
</xsl:element>
<xsl:element name="grand_total">
<xsl:value-of select="total"/>
</xsl:element>
<xsl:element name="shipping_amount">
<xsl:value-of select="shipping"/>
</xsl:element>
<xsl:element name="state">
<xsl:value-of select="status"/>
</xsl:element>
<xsl:element name="created_at">
<xsl:value-of select="created"/>
</xsl:element>
<xsl:for-each select="client">
<address:customer_id>
<xsl:value-of select="client_id"/>
</address:customer_id>
<xsl:element name="address:firstname">
<xsl:value-of select="first_name"/>
</xsl:element>
<xsl:element name="address:lastname">
<xsl:value-of select="last_name"/>
</xsl:element>
<xsl:element name="address:company">
<xsl:value-of select="company"/>
</xsl:element>
<xsl:element name="address:street">
<xsl:value-of select="street"/>
</xsl:element>
<xsl:element name="address:city">
<xsl:value-of select="city"/>
</xsl:element>
<xsl:element name="address:telephone">
<xsl:value-of select="phone"/>
</xsl:element>
<xsl:element name="address:email">
<xsl:value-of select="email"/>
</xsl:element>
<xsl:element name="address:region">
<xsl:value-of select="country"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="items">
<xsl:for-each select="item">
<xsl:element name="product_name">
<xsl:value-of select="name"/>
</xsl:element>
<xsl:element name="product_id">
<xsl:value-of select="product_id"/>
</xsl:element>
<xsl:element name="price">
<xsl:value-of select="price"/>
</xsl:element>
<xsl:element name="item_id">
<xsl:value-of select="item_id"/>
</xsl:element>
<xsl:element name="tax">
<xsl:value-of select="tax"/>
</xsl:element>
<xsl:element name="qty">
<xsl:value-of select="qty"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
我的意图是创建这样的命名空间节点 <address:lastname>
但我得到的结果是 <address:firstname xmlns:address="http://base.google.com/ns/1.0">
我是 XSLT 的新手所以不太确定问题是什么提到排除命名空间前缀选项的帖子数也不起作用
首先,您报告的结果是正确的:格式正确的 XML 文档不能使用前缀而不将其绑定到命名空间。如果您的目标应用程序无法处理此问题,则它不符合 XML 规范。
但是,您可以尝试将命名空间声明移动到根元素,而不是在每个 address::*
元素上重复它。而不是:
<xsl:element name="Items" >
使用:
<Items xmlns:address="http://base.google.com/ns/1.0">
并从您的 xsl:stylesheet
开始标记中删除相同的命名空间声明。这应该导致文档结构如下:
<Items xmlns:address="http://base.google.com/ns/1.0">
<item>
<entity_id/>
<grand_total/>
<shipping_amount/>
<state/>
<created_at/>
<address:customer_id/>
<address:firstname/>
<address:lastname/>
<address:company/>
<address:street/>
<address:city/>
<address:telephone/>
<address:email/>
<address:region/>
</item>
</Items>
希望您的目标应用程序可以比您的(语义相同的)当前结果处理得更好。
如评论中所述,您可以通过将所有其他 xsl:element
指令也替换为文字结果元素来简化样式表。
所以我在样式表中声明了我的命名空间,如下所示
<xmlns:address="http://base.google.com/ns/1.0"
下面是我的整个 XSLT 转换模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:address="http://base.google.com/ns/1.0" exclude-result-prefixes="address">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="success"/>
<xsl:template match="paging"/>
<xsl:template match="orders">
<xsl:element name="Items" >
<xsl:for-each select="order">
<xsl:element name="item">
<xsl:element name="entity_id">
<xsl:value-of select="order_no"/>
</xsl:element>
<xsl:element name="grand_total">
<xsl:value-of select="total"/>
</xsl:element>
<xsl:element name="shipping_amount">
<xsl:value-of select="shipping"/>
</xsl:element>
<xsl:element name="state">
<xsl:value-of select="status"/>
</xsl:element>
<xsl:element name="created_at">
<xsl:value-of select="created"/>
</xsl:element>
<xsl:for-each select="client">
<address:customer_id>
<xsl:value-of select="client_id"/>
</address:customer_id>
<xsl:element name="address:firstname">
<xsl:value-of select="first_name"/>
</xsl:element>
<xsl:element name="address:lastname">
<xsl:value-of select="last_name"/>
</xsl:element>
<xsl:element name="address:company">
<xsl:value-of select="company"/>
</xsl:element>
<xsl:element name="address:street">
<xsl:value-of select="street"/>
</xsl:element>
<xsl:element name="address:city">
<xsl:value-of select="city"/>
</xsl:element>
<xsl:element name="address:telephone">
<xsl:value-of select="phone"/>
</xsl:element>
<xsl:element name="address:email">
<xsl:value-of select="email"/>
</xsl:element>
<xsl:element name="address:region">
<xsl:value-of select="country"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="items">
<xsl:for-each select="item">
<xsl:element name="product_name">
<xsl:value-of select="name"/>
</xsl:element>
<xsl:element name="product_id">
<xsl:value-of select="product_id"/>
</xsl:element>
<xsl:element name="price">
<xsl:value-of select="price"/>
</xsl:element>
<xsl:element name="item_id">
<xsl:value-of select="item_id"/>
</xsl:element>
<xsl:element name="tax">
<xsl:value-of select="tax"/>
</xsl:element>
<xsl:element name="qty">
<xsl:value-of select="qty"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
我的意图是创建这样的命名空间节点 <address:lastname>
但我得到的结果是 <address:firstname xmlns:address="http://base.google.com/ns/1.0">
我是 XSLT 的新手所以不太确定问题是什么提到排除命名空间前缀选项的帖子数也不起作用
首先,您报告的结果是正确的:格式正确的 XML 文档不能使用前缀而不将其绑定到命名空间。如果您的目标应用程序无法处理此问题,则它不符合 XML 规范。
但是,您可以尝试将命名空间声明移动到根元素,而不是在每个 address::*
元素上重复它。而不是:
<xsl:element name="Items" >
使用:
<Items xmlns:address="http://base.google.com/ns/1.0">
并从您的 xsl:stylesheet
开始标记中删除相同的命名空间声明。这应该导致文档结构如下:
<Items xmlns:address="http://base.google.com/ns/1.0">
<item>
<entity_id/>
<grand_total/>
<shipping_amount/>
<state/>
<created_at/>
<address:customer_id/>
<address:firstname/>
<address:lastname/>
<address:company/>
<address:street/>
<address:city/>
<address:telephone/>
<address:email/>
<address:region/>
</item>
</Items>
希望您的目标应用程序可以比您的(语义相同的)当前结果处理得更好。
如评论中所述,您可以通过将所有其他 xsl:element
指令也替换为文字结果元素来简化样式表。