代码之家  ›  专栏  ›  技术社区  ›  bilak

xslt从外部文档复制属性

  •  0
  • bilak  · 技术社区  · 6 年前

    <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-3.6.xsd">
        <changeSet author="system (generated)" id="1538720867962-1">
          <createTable tableName="AS_JOURNALEVENTDETAILATTRMAP">
                <column name="JOURNALEVENTTYPEID" type="NUMBER(9, 0)">
                    <constraints primaryKey="true" primaryKeyName="PK$AS_JOURNALEVENTDETATTRMAP"/>
                </column>
                <column name="JOURNALEVENTDETAILATTRID" type="NUMBER(9, 0)">
                    <constraints primaryKey="true" primaryKeyName="PK$AS_JOURNALEVENTDETATTRMAP"/>
                </column>
                <column name="LISTORDER" type="NUMBER(9, 0)">
                    <constraints nullable="false"/>
                </column>
            </createTable>
       </changeSet>
       <changeSet id="c529c6ea-45c2-4ec2-8c9d-7bc935434d21" author="system">
          <setTableRemarks remarks="this is wrong"
                           tableName="AS_JOURNALEVENTDETAILATTRMAP"/>
          <setColumnRemarks tableName="AS_JOURNALEVENTDETAILATTRMAP"
                            columnName="JOURNALEVENTTYPEID"
                            remarks="Journal event type identifier"/>
          <setColumnRemarks tableName="AS_JOURNALEVENTDETAILATTRMAP"
                            columnName="JOURNALEVENTDETAILATTRID"
                            remarks="Journal event detail attribute identifier"/>
          <setColumnRemarks tableName="AS_JOURNALEVENTDETAILATTRMAP"
                            columnName="LISTORDER"
                            remarks="Order in list"/>
       </changeSet>
    </databaseChangeLog>
    

    和名字完全相同的文件 fixedremarks.xml <setTableRemarks remarks="this is ok" tableName="AS_JOURNALEVENTDETAILATTRMAP"/>

    使用下面的模板,我试图修复属性 remarks 里面 setTableRemarks 但是没有成功-我不知道如何正确地从外部xml复制该属性。

    <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                   xpath-default-namespace="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns="http://www.liquibase.org/xml/ns/dbchangelog">
        <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    
        <xsl:variable name="originalChangeLog" select="document('/tmp/fixedremarks.xml')"/>
    
        <xsl:template match="node()|@*">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:key name="remarkTableName" match="setTableRemarks" use="@tableName"/>
    
        <xsl:template match="changeSet[setTableRemarks]">
            <xsl:variable name="currentRemarkTable" select="setTableRemarks/@tableName"/>
            <xsl:comment select="$currentRemarkTable"/>
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:element name="setTableRemarks">
    
                    <xsl:attribute name="remarks"
                                   select="$originalChangeLog/key('remarkTableName', $currentRemarkTable)"/>
                    <xsl:attribute name="tableName" select="setTableRemarks/@tableName"/>
                </xsl:element>
                <xsl:copy-of select="*[not(self::setTableRemarks)]"/>
            </xsl:copy>
    
        </xsl:template>
    
    </xsl:transform>
    

    有人能告诉我如何正确地从外部文件映射备注吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Martin Honnen    6 年前

    我想你只需要你的身份转换模板

    <xsl:template match="changeSet/setTableRemarks[key('remarkTableName', @tableName, $originalChangeLog)]/@remarks">
      <xsl:attribute name="{name()}" select="key('remarkTableName', ../@tableName, $originalChangeLog)/@remarks"/>
    </xsl:template>
    

    https://xsltfiddle.liberty-development.net/6qVRKwR 有一个在线示例(在那里,对于自包含的示例,辅助XML作为变量内联,但是如果您保留 <xsl:variable name="originalChangeLog" select="document('/tmp/fixedremarks.xml')"/> 它也会起作用。