来自外部文档的xslt复制属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自外部文档的xslt复制属性相关的知识,希望对你有一定的参考价值。

我跟随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-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>

有人可以告诉我如何从外部文件中正确地映射评论?

答案

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

<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')"/>它也会起作用。

以上是关于来自外部文档的xslt复制属性的主要内容,如果未能解决你的问题,请参考以下文章

使用命名空间时无法在 XSLT 中复制和修改属性

XSLT:无法将操作数转换为“结果树片段”

将 XSLT 转换的 XML 片段写入 XMLStreamWriter

如何使用 xslt 获取 XML 的属性值和代码作为 html 的值

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?

XSLT - 根据其他属性的值复制某些属性