我正在尝试将目录('输出')中的多个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
我想,如果您在名称空间xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
中具有元素,则要在XSLT中使用xpath-default-namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
。否则,您的urlset/url/loc
之类的路径将在没有名称空间的情况下选择那些名称的元素。