2013-09-10 10 views
3

Я пытаюсь привыкнуть к XSLT, и я понимаю причину пространств имен, но я просто пытаюсь преобразовать локальные файлы XML, которые будут потребляться локальным приложением.XSLT Игнорировать пространство имен

Я пытаюсь преобразовать файл, найденный здесь: http://uscodebeta.house.gov/download/releasepoints/us/pl/113/31/[email protected]

, используя этот код:

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" name="xml"/> 
    <xsl:template match="//title"> 
     <xsl:for-each select="section"> 
      <xsl:variable name="href"><xsl:value-of select="ancestor::title/num/@value" />-<xsl:value-of select="ancestor::chapter/num/@value" />-<xsl:value-of select="num/@value" />.xml</xsl:variable> 
      <xsl:result-document href="$href"> 
       <xsl:element name="structure"> 
        <xsl:element name="unit"> 
         <xsl:attribute name="label">title</xsl:attribute> 
         <xsl:attribute name="identifier"> 
          <xsl:value-of select="ancestor::title/num/@value" /> 
         </xsl:attribute> 
         <xsl:attribute name="order_by"> 
          <xsl:value-of select="ancestor::title/num/@value" /> 
         </xsl:attribute> 
         <xsl:attribute name="level">1</xsl:attribute> 
         <xsl:value-of select="ancestor::title/num" /> <xsl:value-of select="ancestor::title/heading"/> 
        </xsl:element> 
       </xsl:element> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

в примере XML найти здесь: https://github.com/statedecoded/statedecoded/wiki/XML-Format-for-Parser

Это преобразование для всего первый элемент, но при работе с саксоном в командной строке я получаю предупреждение:

Warning: SXXP0005: The source document is in namespace http://xml.house.gov/schemas/uslm/1.0, but all the template rules match elements in no namespace 

и вывод представляет собой простой текст вместо тегов XML.

Любая помощь была бы принята с благодарностью.

Благодаря

+2

Пожалуйста, не полагаться так сильно на ссылки на внешние веб-сайты. Некоторые из нас не доверяют ссылкам, особенно в ZIP-файлах, и даже если мы им доверяем, это добавляет усилия, чтобы ответить на вопрос. Также ссылки часто исчезают во времени, делая SO архивы менее полезными. –

ответ

6

Поскольку вы используете XSLT 2.0 вы можете добавить атрибут xpath-default-namespace на xsl:stylesheet. См. http://www.w3.org/TR/xslt20/#standard-attributes для получения более подробной информации.

Например:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xpath-default-namespace="http://xml.house.gov/schemas/uslm/1.0"> 

У вас также есть возможность использовать * в качестве префикса для каждого элемента в ваших путях. Это может закончиться большой работой, хотя если ваша таблица стилей растет.

Пример:

ancestor::*:title/*:num 

Полный пример:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="http://xml.house.gov/schemas/uslm/1.0"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:template> 

    <xsl:template match="section"> 
     <xsl:result-document href="{ancestor::title/num/@value}-{ancestor::chapter/num/@value}-{num/@value}.xml"> 
      <structure> 
       <unit label="title" identifier="{ancestor::title/num/@value}" 
        order_by="{ancestor::title/num/@value}" level="1"> 
        <xsl:value-of select="concat(ancestor::title/num,' ',ancestor::title/heading)"/> 
       </unit> 
      </structure> 
     </xsl:result-document> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Добавление пространства имен xpath-default позволяет запускать его без предупреждения, но он не создает файл для каждого раздела и все еще выводит текст. Вот что она производит: Название 1 USCTitle Интернет @ 113-31 OLRC 2013-07-26T05: 14: 38 USCConverter 1,0 – Chris

+0

Я не смотрел на данные, но вы уверены, что 'section' является дочерним элементом' title'? Это то, что говорит ваш XSLT. –

+0

Просто посмотрел данные. 'section' является потомком' title'. Попробуйте изменить 'select' в' xsl: for-each' на 'chapter/section'. –

Смежные вопросы