按参数值拆分 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>