XSLT从原始文件中删除已处理/选择未处理的数据
嗨,我正在处理一个巨大的文件(50k行),需要知道哪些节点没有被处理。 我在考虑这个解决方案:XSLT从原始文件中删除已处理/选择未处理的数据,xslt,saxon,Xslt,Saxon,嗨,我正在处理一个巨大的文件(50k行),需要知道哪些节点没有被处理。 我在考虑这个解决方案: 创建处理文件的副本,找到匹配的模板后,将其从复制的文件中删除 创建所有模板的“反向模板”,并选择所有未处理的模板(这可能不起作用) 正常处理文件,然后在原始文件和使用此模板创建的文件之间创建差异 那么什么是最好的方法呢?如果需要提供更多细节,请告诉我 以下是我的示例xml: <?xml version="1.1" encoding="UTF-8" standalone="no"?> &
- 创建处理文件的副本,找到匹配的模板后,将其从复制的文件中删除
- 创建所有模板的“反向模板”,并选择所有未处理的模板(这可能不起作用)
- 正常处理文件,然后在原始文件和使用此模板创建的文件之间创建差异
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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
http://www.liquibase.org/xml/ns/dbchangelog">
<changeSet id="1" author="a">
<createTable tableName="TABLE1">
<column></column>
</createTable>
</changeSet>
<changeSet id="1-1" author="a">
<createSequence sequenceName="SEQ_TABLE1" />
</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"
xpath-default-namespace="http://www.liquibase.org/xml/ns/dbchangelog">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:variable name="coreTables"
select="('TABLE1','TABLE2')"/>
<xsl:template match="node()[not(self::*)]">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="databaseChangeLog">
<!-- CORE-->
<xsl:comment> CORE TABLES </xsl:comment>
<xsl:apply-templates select="changeSet[createTable/@tableName=$coreTables]"/>
<xsl:comment>CORE SEQUENCES</xsl:comment>
<xsl:apply-templates
select="changeSet[createSequence[starts-with(@sequenceName, 'SEQ_') and substring-after(@sequenceName, 'SEQ_') = $coreTables]]"/>
<xsl:comment> CORE INDEXES </xsl:comment>
<xsl:apply-templates select="changeSet[createIndex/@tableName=$coreTables]"/>
<xsl:comment> CORE FOREIGN CONSTRAINTS </xsl:comment>
<xsl:apply-templates select="changeSet[addForeignKeyConstraint/@baseTableName=$coreTables]"/>
<xsl:comment> CORE VIEWS </xsl:comment>
<xsl:apply-templates select="changeSet[createView/@viewName=$coreTables]"/>
</xsl:template>
</xsl:transform>
核心表
核心序列
核心指标
国外的核心制约因素
核心观点
我正在使用XSLT2和saxom 9.8he
谢谢你不要这样做
<xsl:comment> CORE TABLES </xsl:comment>
<xsl:apply-templates select="changeSet[createTable/@tableName=$coreTables]"/>
核心表
执行此操作,以保存选定的图元
<xsl:variable name="tables" select="changeSet[createTable/@tableName=$coreTables]"/>
<xsl:apply-templates select="$tables" />
其他语句也是如此。然后,要获取XML中未匹配的元素,可以执行以下操作
<xsl:apply-templates select="changeSet[not(some $set in ($tables | $sequences | $indexes | $fkeys | $views) satisfies $set is .)]" />
试试这个模板
<xsl:template match="databaseChangeLog">
<!-- CORE-->
<xsl:comment> CORE TABLES </xsl:comment>
<xsl:variable name="tables" select="changeSet[createTable/@tableName=$coreTables]"/>
<xsl:apply-templates select="$tables" />
<xsl:comment>CORE SEQUENCES</xsl:comment>
<xsl:variable name="sequences" select="changeSet[createSequence[starts-with(@sequenceName, 'SEQ_') and substring-after(@sequenceName, 'SEQ_') = $coreTables]]"/>
<xsl:apply-templates select="$sequences"/>
<xsl:comment> CORE INDEXES </xsl:comment>
<xsl:variable name="indexes" select="changeSet[createIndex/@tableName=$coreTables]"/>
<xsl:apply-templates select="$indexes"/>
<xsl:comment> CORE FOREIGN CONSTRAINTS </xsl:comment>
<xsl:variable name="fkeys" select="changeSet[addForeignKeyConstraint/@baseTableName=$coreTables]"/>
<xsl:apply-templates select="$fkeys"/>
<xsl:comment> CORE VIEWS </xsl:comment>
<xsl:variable name="views" select="changeSet[addForeignKeyConstraint/@baseTableName=$coreTables]"/>
<xsl:apply-templates select="$views"/>
<xsl:comment> UNMATCHED </xsl:comment>
<xsl:apply-templates select="changeSet[not(some $set in ($tables | $sequences | $indexes | $fkeys | $views) satisfies $set is .)]" />
</xsl:template>
核心表
核心序列
核心指标
国外的核心制约因素
核心观点
无与伦比的
编辑:多亏了Martin Honnen,最终的表达式可以简化为
<xsl:apply-templates select="changeSet except ($tables, $sequences, $indexes, $fkeys, $views)" />
我不太清楚你说的“未处理”是什么意思。您的意思是“未被xsl:apply模板上的任何调用选中”吗?当然,这不是一回事,一个节点可能会使用xsl:for-each等进行处理。此外,我怀疑您只对没有以这种方式“处理”的元素感兴趣,而对其他节点(如属性和名称空间)不感兴趣
一种可能(也可能不)满足您需求的方法是编写TraceListener。如果将TraceListener附加到转换,则每次指令更改上下文项时都会通知它(这是“正在处理”的另一个定义)。然后,您的TraceListener可以构建一个Java集,其中包含所接触的所有节点,然后可以在处理完成后将其与所有节点集进行区分。考虑让每个单独的问题直接在问题中解释必要的细节。从一个特定问题的链接和一个文本中说你有一个“类似于”这个问题的模板是不可能理解你的大文件以何种方式包含“无法处理”的数据的。在使用Saxon 9.8时,您可以访问XSLT 3,在XSLT 3中,您可以在no match=“fail”()上定义
xsl:mode,以获得关于您编写的显式模板未处理的节点的通知。但是我不确定你想要的是什么。很抱歉,编辑的问题是changeSet[不是($tables |$sequences |$index |$fkeys |$views)中的一些$set满足$set is。)
不是更简单的表达为变更集,除了($tables,$sequences,$fkeys,$views)
?是的。我希望你们能来为我提供一个更简单的表达:)谢谢你们两位……希望我的最后一个问题。我能把那个不匹配的部分写到单独的文件中吗?是的。请继续阅读