2

数据文件:

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

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

xsltproc table.xslt liquibase.changelog.xml

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

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

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

4

1 回答 1

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>
于 2013-01-15T15:48:51.923 回答