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

xslt 2 copy parent element based on input array with loop

我关注xml:

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

我想要 select 整个 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>

我正在使用 saxon 9.8he 进行转换。

你应该使用xsl:copy-of而不是只输出节点字符串值的xsl:value-of。而且您还需要 select .. 来获取父元素(执行 ../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>