Я пытаюсь объединить несколько XML файлов в каталоге («выходные данные») в один отдельный файл в другом каталоге («объединить»). Файлы xml представляют собой довольно простые файлы Sitemap:
<?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 () для получения содержимого файлов, но не могу получить доступ к каким-либо элементам в этих файлах, когда они находятся в 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
выше или с помощью различных ссылок (см. Ниже), это просто ничего не показывает.
I ' мы пробовали:
<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>
Если это поможет, вот саксонская команда, которую я использую:
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
Редактировать -solved!
Сочетание двух вещей :
- Ответ Мартина ниже: вам необходимо задать для пространства имен xpath-default-name пространство имен в исходных файлах:
xpath-default-namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
- Переменная коллекции не работала с отличные значения по любой причине. Мне нужно было определить коллекцию и получить к ней доступ напрямую с помощью команды Different-values:
<xsl:variable name="loc" select="distinct-values(collection('output?strip-space=yes;select=*.xml')/urlset/url/loc)"/>