2013-01-15 52 views
2

數據文件:使用xsltproc工具這個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 input.xslt input.xml 

輸出什麼。

我的xslt有什麼問題?

最終工作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> 

注:這個拆分的changelog(liquibase generateChangeLog輸出)成單個變化 日誌文件

xsltproc table.xslt liquibase.changelog.xml

這是在日誌文件中每個changeSet成功生成一個文件。 (我的下一個目標是將單個表上的變更集進行分組,但這不在此問題的範圍內)

如果您想知道我在做什麼。

Liquibase遷移工具爲現有數據庫生成單個更改日誌文件。我正在嘗試將每個表/對象(特別是mysql)的輸出拆分爲單獨的日誌文件。

回答

2

樣式表中缺少命名空間。 這工作:

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

我會接受它在一段時間工作的偉大,感謝@proskor – sakhunzai

+0

我不認爲這會工作。 –

+1

好吧,可能copy-of元素的select屬性應該是select =「。」而不是select =「*」,但這不是問題。 – proskor