Что не так с этим xslt?

Файл данных:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
    <changeSet >
      ...
    </changeSet>
    <changeSet >
      ...
    </changeSet>
</databaseChangeLog>

xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">    
      <xsl:for-each select="databaseChangeLog/changeSet">       
        <top>  
         <xsl:copy-of select="*"/>      
        </top> 
      </xsl:for-each>   
  </xsl:template>
</xsl:stylesheet>

с помощью инструмента xsltproc:

xsltproc input.xslt  input.xml

ничего не выводит.

Что не так с моим xslt?

final working table.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:db="http://www.liquibase.org/xml/ns/dbchangelog"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml"  indent="yes" />
  <xsl:template match="/">    
      <xsl:for-each select="db:databaseChangeLog/db:changeSet">     
          <xsl:document  href="base/tables/{position()}_{name(*[1])}_{*[1]/@tableName}.xml">
           <databaseChangeLog 
                xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">               
                <xsl:copy-of select="."/>                   
            </databaseChangeLog> 
        </xsl:document> 
      </xsl:for-each>     
  </xsl:template>
</xsl:stylesheet>

примечание: при этом журнал изменений (вывод Liquibase generateChangeLog) разбивается на отдельные файлы журнала изменений.

xsltproc table.xslt liquibase.changelog.xml

Это успешно создает один файл для каждого набора изменений в файле журнала. (Моя следующая цель - сгруппировать наборы изменений, которые находятся в одной таблице, но это выходит за рамки этого вопроса)

Если вам интересно, что я делаю.

Инструменты миграции Liquibase создают единый файл журнала изменений для существующей базы данных. Я экспериментировал, чтобы разделить этот вывод в отдельный файл журнала для каждой таблицы / объекта (в частности, mysql)


person sakhunzai    schedule 15.01.2013    source источник


Ответы (1)


Пространство имен отсутствует в таблице стилей. Это работает:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:db="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">    
      <xsl:for-each select="db:databaseChangeLog/db:changeSet">       
        <top>  
          <xsl:copy-of select="*"/>      
        </top> 
      </xsl:for-each>   
  </xsl:template>
</xsl:stylesheet>
person proskor    schedule 15.01.2013
comment
Что ж, вероятно, атрибут select элемента copy-of должен быть select =. вместо select = *, но проблема здесь не в этом. - person proskor; 15.01.2013
comment
Скорее всего, это не будет выводить правильно сформированный XML (несколько элементов верхнего уровня), но это было бы проблемой и в исходном XSL вопроса, если бы он работал. - person JLRishe; 15.01.2013
comment
Это потому, что существует несколько элементов верхнего уровня (как указал JLRishe). Просто вставьте каждый элемент в свою таблицу стилей в корневой элемент. - person proskor; 16.01.2013