这个xslt有什么问题?

时间:2013-01-15 15:41:18

标签: mysql xml xslt liquibase

数据文件:

<?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出了什么问题?

最终工作表.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>

注意:这会将changelog(liquibase generateChangeLog输出)拆分为单独的更改 日志文件

xsltproc table.xslt liquibase.changelog.xml

这在日志文件中为每个changeSet成功生成一个文件。 (我的下一个目标是对单个表上的变更集进行分组,但这超出了此问题的范围)

如果你想知道我在做什么。

Liquibase迁移工具为现有数据库生成单个更改日志文件。我正在尝试将该输出拆分为每个表/对象(特别是mysql)的单独日志文件

1 个答案:

答案 0 :(得分:3)

样式表中缺少命名空间。 这有效:

<?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>