按参数值拆分 google XML 项
Split google XML items by param value
我在 google 供应商标准中有一个 xml 文件。产品有两种语言版本。我想将它分成两个单独的 xml 文件,保持文件结构。困难的部分是,语言信息仅在字段 link(.pl 或 .en)中给出。
两个单独的文件会很棒,但一个也可以(我只是让第二个 运行 具有第二个条件)。
我在js中想到了这样的东西(伪代码):
file.rss.channel.children.filter(item=>{return item.link.includes(".en")})
我试过 xmlstarlet,但没有成功
输入文件上一个:
<rss xmlns:g="http://base.google.com/ns/1.0"
xmlns:c="http://base.google.com/cns/1.0" version="2.0">
<channel>
<title>
<![CDATA[ Brand ]]>
</title>
<link><![CDATA[ site.link.pl ]]></link>
<description><![CDATA[ ]]></description>
<item>
<g:id>132430</g:id>
<link><![CDATA[item.link.pl]]></link>
<g:canonical_link>item.link.pl</g:canonical_link>
</item>
<item>
<g:id>132431</g:id>
<link><![CDATA[item.link.en]]></link>
<g:canonical_link>item.link.en</g:canonical_link>
</item>
</channel>
</rss>
预期结果文件:
<rss xmlns:g="http://base.google.com/ns/1.0"
xmlns:c="http://base.google.com/cns/1.0" version="2.0">
<channel>
<title>
<![CDATA[ Brand ]]>
</title>
<link><![CDATA[ site.link.pl ]]></link>
<description><![CDATA[ ]]></description>
<item>
<g:id>132431</g:id>
<link><![CDATA[item.link.en]]></link>
<g:canonical_link>item.link.en</g:canonical_link>
</item>
</channel>
</rss>
我不知道如何实现这一点,如果有任何提示,我将不胜感激。
此 XSLT 3.0 样式表:
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="//item">
<xsl:result-document href="{tokenize(normalize-space(.), '\.')[last()]}.xml"
indent="yes"
cdata-section-elements="title link">
<xsl:apply-templates select="root(.)/*">
<xsl:with-param name="this-item" select="."/>
</xsl:apply-templates>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="item">
<xsl:param name="this-item"/>
<xsl:if test=". is $this-item">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:transform>
输出两个结果文件,en.xml和pl.xml。这里是 en.xml:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:c="http://base.google.com/cns/1.0"
xmlns:g="http://base.google.com/ns/1.0"
version="2.0">
<channel>
<title><![CDATA[
Brand
]]></title>
<link><![CDATA[ site.link.pl ]]></link>
<description/>
<item>
<g:id>132431</g:id>
<link><![CDATA[item.link.en]]></link>
<g:canonical_link>item.link.en</g:canonical_link>
</item>
</channel>
</rss>
我在 google 供应商标准中有一个 xml 文件。产品有两种语言版本。我想将它分成两个单独的 xml 文件,保持文件结构。困难的部分是,语言信息仅在字段 link(.pl 或 .en)中给出。 两个单独的文件会很棒,但一个也可以(我只是让第二个 运行 具有第二个条件)。
我在js中想到了这样的东西(伪代码):
file.rss.channel.children.filter(item=>{return item.link.includes(".en")})
我试过 xmlstarlet,但没有成功
输入文件上一个:
<rss xmlns:g="http://base.google.com/ns/1.0"
xmlns:c="http://base.google.com/cns/1.0" version="2.0">
<channel>
<title>
<![CDATA[ Brand ]]>
</title>
<link><![CDATA[ site.link.pl ]]></link>
<description><![CDATA[ ]]></description>
<item>
<g:id>132430</g:id>
<link><![CDATA[item.link.pl]]></link>
<g:canonical_link>item.link.pl</g:canonical_link>
</item>
<item>
<g:id>132431</g:id>
<link><![CDATA[item.link.en]]></link>
<g:canonical_link>item.link.en</g:canonical_link>
</item>
</channel>
</rss>
预期结果文件:
<rss xmlns:g="http://base.google.com/ns/1.0"
xmlns:c="http://base.google.com/cns/1.0" version="2.0">
<channel>
<title>
<![CDATA[ Brand ]]>
</title>
<link><![CDATA[ site.link.pl ]]></link>
<description><![CDATA[ ]]></description>
<item>
<g:id>132431</g:id>
<link><![CDATA[item.link.en]]></link>
<g:canonical_link>item.link.en</g:canonical_link>
</item>
</channel>
</rss>
我不知道如何实现这一点,如果有任何提示,我将不胜感激。
此 XSLT 3.0 样式表:
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="//item">
<xsl:result-document href="{tokenize(normalize-space(.), '\.')[last()]}.xml"
indent="yes"
cdata-section-elements="title link">
<xsl:apply-templates select="root(.)/*">
<xsl:with-param name="this-item" select="."/>
</xsl:apply-templates>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="item">
<xsl:param name="this-item"/>
<xsl:if test=". is $this-item">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:transform>
输出两个结果文件,en.xml和pl.xml。这里是 en.xml:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:c="http://base.google.com/cns/1.0"
xmlns:g="http://base.google.com/ns/1.0"
version="2.0">
<channel>
<title><![CDATA[
Brand
]]></title>
<link><![CDATA[ site.link.pl ]]></link>
<description/>
<item>
<g:id>132431</g:id>
<link><![CDATA[item.link.en]]></link>
<g:canonical_link>item.link.en</g:canonical_link>
</item>
</channel>
</rss>