gpt4 book ai didi

XSLT 命名空间和解析硬编码前缀

转载 作者:行者123 更新时间:2023-12-04 16:56:30 25 4
gpt4 key购买 nike

对于 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")

2)前缀属性

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

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

,然后 exclude-result-prefixes 工作正常。但是,当我向元素添加前缀时, namespace 会在 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

最佳答案

您需要在某处声明 namespace ,因为没有它,XML 就不是 namespace 格式良好的,但是您可以让它在根元素上只出现一次,而不是在每个 <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>

这样做的原因是因为文字结果元素将在样式表中的位置范围内的命名空间绑定(bind)传递到结果树中。

关于XSLT 命名空间和解析硬编码前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13746804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com