1

对于 Google Merchant Center 集成,我需要提供 XML,其中一些元素具有命名空间前缀,例如:

   <g:availability>in stock</g:availability>, 

而其他不需要命名空间,例如:

   <title>My Product</title>

但是,我无法想出一个允许我的 XSLT:

1) 指定相应的命名空间 (xmlns:g="http://base.google.com/ns/1.0") AND 2) 前缀属性

,没有在某处添加“g”命名空间。


我相信 exclude-result-prefixes="g" 不适用于我的用例。要重新迭代,我需要在一些 XML 元素前面加上“g”。如果我不需要这样做,例如

<availability>in stock<availability> 

,然后 exclude-result-prefixes 工作正常。但是,当我将前缀添加到我的元素时,命名空间会在 XSLT 运行时添加。我在下面有一个这种情况的例子。

谢谢。


XSLT:

<xsl:template match="/">

    <xsl:element name="type">
        <xsl:for-each select="categories/product">
            <xsl:element name="product">
                <g:availability>
                    <xsl:text>preorder</xsl:text>
                </g:availability>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
</xsl:template>


XML:

<?xml version="1.0" encoding="UTF-8"?>
<categories>
<product>
<id>1</id> 
<preorder>true</preorder>
<releaseDate>true</releaseDate>
<quantity>1</quantity>
</product>
<product>
<id>2</id> 
<preorder>false</preorder>
<quantity>0</quantity>
</product>
<product>
<id>3</id> 
<preorder></preorder>
<quantity>10</quantity>
</product>

输出:

<?xml version="1.0" encoding="UTF-8"?>
<type>
<product>
<g:availability xmlns:g="http://base.google.com/ns/1.0">preorder</g:availability>
</product>
<product>
<g:availability xmlns:g="http://base.google.com/ns/1.0">preorder</g:availability>
</product>
<product>
<g:availability xmlns:g="http://base.google.com/ns/1.0">preorder</g:availability>
</product>
</type>

(不完整)Google Merchant,预期的 XML 示例

<?xml version="1.0"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
<channel>
<title>Example - Online Store</title>
<item>
<title>LG Flatron M2262D 22" Full HD LCD TV</title>
<g:id>TV_123456</g:id>
<g:condition>used</g:condition>
</item>     
</channel>
</rss>

使用 XSLT 版本 1

4

1 回答 1

1

您需要在某处声明命名空间,因为没有它,XML 的命名空间格式不正确,但是您可以<g:availability>通过在样式表中声明命名空间并使用文字根元素,使其在根元素上只出现一次,而不是在每个元素上重复出现模板而不是<xsl:element>. 例如,要生成类似于您在问题中提供的 Google 示例的内容,您可以说:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:g="http://base.google.com/ns/1.0">

    <xsl:template match="/">
        <rss version="2.0">
            <channel>
                <title>Example - Online Store</title>
                <xsl:for-each select="categories/product">
                    <item>
                        <g:id><xsl:value-of select="id"/></g:id>
                        <g:availability>preorder</g:availability>
                    </item>
                </xsl:for-each>
             </channel>
        </rss>
    </xsl:template>
</xsl:stylesheet>

这应该产生

<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
  <channel>
    <title>Example - Online Store</title>
    <item>
      <g:id>1</g:id>
      <g:availability>preorder</g:availability>
    </item>
    <item>
      <g:id>2</g:id>
      <g:availability>preorder</g:availability>
    </item>
    <item>
      <g:id>3</g:id>
      <g:availability>preorder</g:availability>
    </item>
  </channel>
</rss>

这样做的原因是因为字面量结果元素将在样式表中其位置范围内的名称空间绑定传递到结果树中。

于 2012-12-06T15:32:07.617 回答