XSLT-访问集合中的元素

问题描述 投票:0回答:1

我正在尝试将目录('输出')中的多个XML文件合并到不同目录('combine')中的一个文件中。 xml文件是非常简单的站点地图:

   <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
       <url>
          <loc>https://blahblah.com/blah</loc>
          <changefreq>weekly</changefreq>
       </url>
       <url>
          <loc>https://blahblah.com/blah/blah</loc>
          <changefreq>weekly</changefreq>
       </url>
</urlset>

我可以成功地使用Collection()来检索文件的内容,但是一旦它们位于集合中,我似乎无法访问这些文件中的任何元素。

我的XSLT看起来像这样:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>
<xsl:template name="main">
<xsl:variable name="collection" select="collection('output?recurse=yes;select=*.xml')/*"/>
<xsl:variable name="loc" select="distinct-values($collection/urlset/url/loc)"/>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
  <xsl:for-each select="$loc">
 <url>
    <loc>  
   <xsl:value-of select="."/>
    </loc>
    </url>  
   </xsl:for-each>
  </urlset>
</xsl:template>
</xsl:stylesheet>

当前输出。不是很大。

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"/>

如果将<xsl:for-each select="$loc">更改为<xsl:for-each select="$collection">,则会输出每个文件的内容,因此我知道它可以访问该集合。但是,如果我尝试直接访问集合文件中的任何元素,无论是通过上面的distinct-values还是通过各种不同的引用(请参见下文),它都不会显示任何内容。

我尝试过:

<xsl:for-each select="$collection/urlset/url/loc">
 <url>
    <loc>  
   <xsl:value-of select="."/>
    </loc>
    </url>  
   </xsl:for-each>

<xsl:for-each select="$collection">
 <url>
    <loc>  
   <xsl:value-of select="urlset/url/loc"/>
    </loc>
    </url>  
   </xsl:for-each>

<xsl:for-each select="$loc">
 <url>
    <loc>  
   <xsl:value-of select="($collection/urlset/url[loc=current()])"/>
    </loc>
    </url>  
   </xsl:for-each>

没有任何作用,除了输出集合中的所有内容(至少表明可以访问文件:

<xsl:for-each select="$collection">
 <url>
    <loc>  
   <xsl:value-of select="."/>
    </loc>
    </url>  
   </xsl:for-each>

如果有帮助,请使用我正在使用的saxon命令:

java -jar c:\saxon\SaxonHE9-9-1-5J\saxon9he.jar -o:C:\Code\photo.old\xml\sitemap\combine\output.xml -xsl:C:\Code\photo.old\xml\sitemap\combine_s.xslt -it:main
xml xslt collections sitemap saxon
1个回答
0
投票

我想,如果您在名称空间xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"中具有元素,则要在XSLT中使用xpath-default-namespace="http://www.sitemaps.org/schemas/sitemap/0.9"。否则,您的urlset/url/loc之类的路径将在没有名称空间的情况下选择那些名称的元素。

© www.soinside.com 2019 - 2024. All rights reserved.