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 に答える