XSLT1.0转换
我试图用XSLT1.0转换XML文件,但遇到了一些问题 输入:XSLT1.0转换,xslt,xslt-1.0,Xslt,Xslt 1.0,我试图用XSLT1.0转换XML文件,但遇到了一些问题 输入: <task_order> <Q> <record id="1"> <column name="task_externalId">SPLIT4_0</column> </record> <record id="2"> <column name="task_externalId">SPL
<task_order>
<Q>
<record id="1">
<column name="task_externalId">SPLIT4_0</column>
</record>
<record id="2">
<column name="task_externalId">SPLIT4_1</column>
</record>
</Q>
<task>
<id>SPLIT4</id>
<name>test</name>
</task>
</task_order>
拆分4_0
拆分4_1
拆分4
测试
想要的结果:
对于每个task_order元素:当有多个record元素(SPLIT4和SPLIT4_1)时,我需要复制task元素并使用record元素的id更改原始task id
<task_order>
<Q>
<record id="1">
<column name="task_externalId">SPLIT4_0</column>
</record>
<record id="2">
<column name="task_externalId">SPLIT4_1</column>
</record>
</Q>
<task>
<id>SPLIT4_0</id>
<name>test</name>
</task>
<task>
<id>SPLIT4_1</id>
<name>test</name>
</task>
</task_order>
拆分4_0
拆分4_1
拆分4_0
测试
拆分4_1
测试
有什么建议吗
谢谢您首先从标识模板开始,该模板将处理跨所有现有节点的复制
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
然后,您就有了一个模板matchingtask
,您可以在其中使用键查找所有匹配的列
元素,并为每个元素创建一个新的task
元素
<xsl:template match="task">
<xsl:variable name="task" select="." />
<xsl:for-each select="key('column', id)">
<!-- Create new task -->
</xsl:for-each>
</xsl:template>
试试这个XSTL
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="column" match="column" use="substring-before(., '_')" />
<xsl:template match="task">
<xsl:variable name="task" select="." />
<xsl:for-each select="key('column', id)">
<task>
<id><xsl:value-of select="." /></id>
<xsl:apply-templates select="$task/*[not(self::id)]" />
</task>
</xsl:for-each>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我不明白您想要实现的逻辑。如何在结果中映射
/
?为什么,在第一个
元素中,SPLIT4\u 0被更改为SPLIT\u 4?嗯..这是一个传递任务元素(SPLIT4)的接口,但在另一个应用程序中,有两个任务(SPLIT4\u 0和SPLIT\u 1)需要使用接口中的值进行更新。您的上一个语句在我这方面是一个错误
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:key name="column" match="column" use="substring-before(., '_')" />
<xsl:template match="task">
<xsl:variable name="task" select="." />
<xsl:for-each select="key('column', id)">
<task>
<id><xsl:value-of select="." /></id>
<xsl:apply-templates select="$task/*[not(self::id)]" />
</task>
</xsl:for-each>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>