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

XSLT2基于带循环的输入数组复制父元素

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

    <?xml version="1.1" encoding="UTF-8" standalone="no"?>
    <databaseChangeLog>
        <changeSet id="1" author="a">
            <createTable tableName="TABLE1">
                <column></column>
            </createTable>
        </changeSet>
        <changeSet id="2" author="A">
            <createTable tableName="TABLE2">
                <column></column>
            </createTable>
        </changeSet>
        <changeSet id="3" author="A">
            <createTable tableName="TABLE3">
                <column></column>
            </createTable>
        </changeSet>
        <changeSet id="4" author="A">
            <createTable tableName="TABLE4">
                <column></column>
            </createTable>
        </changeSet>
    </databaseChangeLog>
    

    这是我的XSLT:

    <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    
        <xsl:variable name="tables" select="('TABLE1','TABLE4')"/>
    
        <xsl:template match="databaseChangeLog">
            <xsl:for-each select="changeSet/createTable">
                <xsl:if test="@tableName=$tables">
                    <xsl:value-of select="../changeSet"/>
                </xsl:if>
            </xsl:for-each>
        </xsl:template>
    
    </xsl:transform>
    

    changeSet tablename属性将与其中一个匹配的元素 $tables

    <changeSet id="1" author="a">
        <createTable tableName="TABLE1">
            <column></column>
        </createTable>
    </changeSet>
    
    <changeSet id="4" author="A">
        <createTable tableName="TABLE4">
            <column></column>
        </createTable>
    </changeSet>
    

    我正在使用Saxon9.8he进行转换。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tim C    6 年前

    xsl:value-of xsl:copy-of .你还需要选择 .. ../changeSet 将尝试获取名为 changeSet

    <xsl:template match="databaseChangeLog">
        <xsl:for-each select="changeSet/createTable">
            <xsl:if test="@tableName=$tables">
                <xsl:copy-of select=".."/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
    

    请注意,您可以将其简化为…

    <xsl:template match="databaseChangeLog">
        <xsl:for-each select="changeSet/createTable[@tableName=$tables]">
            <xsl:copy-of select=".."/>
        </xsl:for-each>
    </xsl:template>
    

    <xsl:template match="databaseChangeLog">
        <xsl:copy-of select="changeSet[createTable/@tableName=$tables]" />
    </xsl:template>