Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
XSLT1.0-基于其他XML文件中的关系数据转换XML_Xslt_Xslt 1.0 - Fatal编程技术网

XSLT1.0-基于其他XML文件中的关系数据转换XML

XSLT1.0-基于其他XML文件中的关系数据转换XML,xslt,xslt-1.0,Xslt,Xslt 1.0,我需要通过添加一个新元素来转换XML文件,该新元素的值基于当前文件中的数据,另外两个XML文件使用XSLT 1.0。文件: 文件1: <Table> <Row> <ColA>AValue1</ColA> <ColB>BValue1</ColB> </Row> <Row> <ColA>AValue2</ColA&g

我需要通过添加一个新元素来转换XML文件,该新元素的值基于当前文件中的数据,另外两个
XML
文件使用
XSLT 1.0
。文件:

文件1:

<Table>
    <Row>
        <ColA>AValue1</ColA>
        <ColB>BValue1</ColB>
    </Row>
    <Row>
        <ColA>AValue2</ColA>
        <ColB>BValue2</ColB>
    </Row>
</Table>

阿瓦鲁1
B价值1
阿瓦鲁2
B价值2
文件2:

<Table>
    <Row>
        <ColA>AValue1</ColA>
        <ColB>BValue1</ColB>
        <ColC>CValue1</ColC>
    </Row>
    <Row>
        <ColA>AValue1</ColA>
        <ColB>BValue1</ColB>
        <ColC>CValue1</ColC>
    </Row>
<Row>
        <ColA>AValue1</ColA>
        <ColB>BValue1</ColB>
        <ColC>CValue2</ColC>
    </Row>
    <Row>
        <ColA>AValue1</ColA>
        <ColB>BValue1</ColB>
        <ColC>CValue3</ColC>
    </Row>
    <Row>
        <ColA>AValue2</ColA>
        <ColB>BValue2</ColB>
        <ColC>CValue1</ColC>
    </Row>
</Table>

阿瓦鲁1
B价值1
C值1
阿瓦鲁1
B价值1
C值1
阿瓦鲁1
B价值1
C值2
阿瓦鲁1
B价值1
C值3
阿瓦鲁2
B价值2
C值1
文件3:

<Table>
    <Row>
        <ColC>CValue1</ColC>
        <ColD>ABC</ColD>
    </Row>
    <Row>
        <ColC>CValue2</ColC>
        <ColD>DEF</ColD>
    </Row>
    <Row>
        <ColC>CValue3</ColC>
        <ColD>DEF</ColD>
    </Row>
</Table>

C值1
基础知识
C值2
DEF
C值3
DEF
通过ColA和ColB,文件1中的行与文件2中的行具有一对多关系

通过ColC,文件2中的行与文件3中的行具有多对一关系

对于文件1中的每一行,我需要:

  • 在文件2中查找与ColA和ColB匹配的行的不同ColC值

  • 对于每个不同的ColC值,在文件3中查找ColD值以查找与ColC匹配的行

  • 计算在步骤2中查找的冷值的出现次数。ColD将有两个值之一(如“ABC”或“DEF”)。我需要知道“ABC”是否比“DEF”多,如果是,请将ABC添加到文件1中的该行。否则,将DEF添加到文件1中的该行。最后,File1中的每一行都应该有ABC或DEF

  • 所需结果(文件1已转换):

    
    阿瓦鲁1
    B价值1
    DEF
    阿瓦鲁2
    B价值2
    基础知识
    

    DEF将添加到第一行,因为DEF出现两次,而ABC出现1次(不同)。ABC将被添加到第2行,因为有一次出现了ABC和零DEF。

    好吧,我会尝试一个建议,但我不确定是否理解所有内容,所以如果没有意义,我将删除它

    我知道你有一些相关的Xml文件模型。我的意思是,您需要访问文件2中与文件1中的元素相关的元素,以此类推。
    我遇到了一些类似的情况,并通过应用第一个转换首先解决所有文件中的所有引用(在任何地方复制XML节点),然后在这个“不相关的模型”上应用我的更详细的转换来修复它。它更简单,但可能会有一些性能问题(如果有很多关系,则取消所有文件的关联可能会很长),在我的情况下,它是用于离线生成的,因此不需要良好的性能。

    我提出了一个似乎可行的解决方案(没有进行过太多测试)。我在这里重打,所以要小心打字错误。我遇到的最困难的事情是找出如何选择唯一的ColC值。再次查看解决方案,我不需要唯一的值。在我的脑海中,我会循环通过$unique_c_值来计算冷值,但结果不同

    <xsl:template match="node()|@">
        <xsl:copy>
            <xsl:apply-templates select="node()|@">
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Row">
        <xsl:copy>
            <xsl:apply-templates select="node()|@">
    
            <xsl:variable name="unique_c_values" select=
                "document('file2.xml')/Table/Row[current()/ColA = ColA and current()/ColB = ColB]/ColC[not(. = preceding-sibling::*/ColC[current()/ColA = ../ColA and current()/ColB = ../ColB])]"/>
    
            <xsl:variable name="d_values" select=
                "document('file3.xml')/Table/Row[ColC = $unique_c_values]/ColD"/>
    
            <xsl:choose>
                <xsl:when test="count($d_values[. = 'DEF']) &gt; count($d_values[. = 'ABC'])">
                    <ColD>DEF</ColD>
                </xsl:when>
                <xsl:otherwise>
                    <ColD>ABC</ColD>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>
    
    
    DEF
    基础知识
    
    我不认为这是值得的,包括我尝试过的,因为我没有在完全混淆之前做得太远。赖安,考虑发布输入和输出的小样本,这样我们就可以理解你想要达到什么,并有一些样本来测试我们可以做的任何建议。您的文字描述谈到了
    ColD
    值,但我在您发布的示例中没有看到任何值。我修改了帖子,以包含示例输入和所需输出。
    <xsl:template match="node()|@">
        <xsl:copy>
            <xsl:apply-templates select="node()|@">
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="Row">
        <xsl:copy>
            <xsl:apply-templates select="node()|@">
    
            <xsl:variable name="unique_c_values" select=
                "document('file2.xml')/Table/Row[current()/ColA = ColA and current()/ColB = ColB]/ColC[not(. = preceding-sibling::*/ColC[current()/ColA = ../ColA and current()/ColB = ../ColB])]"/>
    
            <xsl:variable name="d_values" select=
                "document('file3.xml')/Table/Row[ColC = $unique_c_values]/ColD"/>
    
            <xsl:choose>
                <xsl:when test="count($d_values[. = 'DEF']) &gt; count($d_values[. = 'ABC'])">
                    <ColD>DEF</ColD>
                </xsl:when>
                <xsl:otherwise>
                    <ColD>ABC</ColD>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>