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>
我关注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>