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
XSLT1.0转换_Xslt_Xslt 1.0 - Fatal编程技术网

XSLT1.0转换

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

我试图用XSLT1.0转换XML文件,但遇到了一些问题

输入

<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>
然后,您就有了一个模板matching
task
,您可以在其中使用键查找所有匹配的
元素,并为每个元素创建一个新的
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>