XSLT1.0-基于其他XML文件中的关系数据转换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
文件使用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中的每一行,我需要:
阿瓦鲁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']) > 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']) > count($d_values[. = 'ABC'])">
<ColD>DEF</ColD>
</xsl:when>
<xsl:otherwise>
<ColD>ABC</ColD>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>