XSLT - доступ к элементам в коллекции - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь объединить несколько 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!
Сочетание двух вещей :

  1. Ответ Мартина ниже: вам необходимо задать для пространства имен xpath-default-name пространство имен в исходных файлах: xpath-default-namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
  2. Переменная коллекции не работала с отличные значения по любой причине. Мне нужно было определить коллекцию и получить к ней доступ напрямую с помощью команды Different-values: <xsl:variable name="loc" select="distinct-values(collection('output?strip-space=yes;select=*.xml')/urlset/url/loc)"/>

1 Ответ

1 голос
/ 03 марта 2020

Полагаю, если у вас есть элементы в пространстве имен xmlns="http://www.sitemaps.org/schemas/sitemap/0.9", вы хотите использовать xpath-default-namespace="http://www.sitemaps.org/schemas/sitemap/0.9" в XSLT. В противном случае ваши пути, такие как urlset/url/loc, будут выбирать элементы этих имен без пространства имен.

...