Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT从原始文件中删除已处理/选择未处理的数据_Xslt_Saxon - Fatal编程技术网

XSLT从原始文件中删除已处理/选择未处理的数据

XSLT从原始文件中删除已处理/选择未处理的数据,xslt,saxon,Xslt,Saxon,嗨,我正在处理一个巨大的文件(50k行),需要知道哪些节点没有被处理。 我在考虑这个解决方案: 创建处理文件的副本,找到匹配的模板后,将其从复制的文件中删除 创建所有模板的“反向模板”,并选择所有未处理的模板(这可能不起作用) 正常处理文件,然后在原始文件和使用此模板创建的文件之间创建差异 那么什么是最好的方法呢?如果需要提供更多细节,请告诉我 以下是我的示例xml: <?xml version="1.1" encoding="UTF-8" standalone="no"?> &

嗨,我正在处理一个巨大的文件(50k行),需要知道哪些节点没有被处理。 我在考虑这个解决方案:

  • 创建处理文件的副本,找到匹配的模板后,将其从复制的文件中删除
  • 创建所有模板的“反向模板”,并选择所有未处理的模板(这可能不起作用)
  • 正常处理文件,然后在原始文件和使用此模板创建的文件之间创建差异
那么什么是最好的方法呢?如果需要提供更多细节,请告诉我

以下是我的示例xml:

<?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)
?是的。我希望你们能来为我提供一个更简单的表达:)谢谢你们两位……希望我的最后一个问题。我能把那个不匹配的部分写到单独的文件中吗?是的。请继续阅读