将XML转换为每个项目的XML

时间:2018-12-13 19:29:31

标签: xml xslt foreach

下午好, 我是XML和XSLT的新手,我正在尝试将下面的第一个XML转换为下面的第二个XML。任何帮助,将不胜感激。 XML用于数据馈送,因此它需要保持与原始格式相同的格式,但是我需要做的是为每个“ Questionnaire_ID”的每个“ Document_to_be_Requested”创建一个单独的“ item”。

原始

<?xml version="1.0" encoding="utf-8"?>
<ex:Record xmlns:ex="http://archertech.com/Print/Export">

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>A</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>C</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>D</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>F</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>


<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>A</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>B</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>F</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>G</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>


</ex:Record>

期望

{{1}}

谢谢!

1 个答案:

答案 0 :(得分:0)

从身份模板开始

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

然后有一个ex:Record/ex:Item节点的模板匹配项。仅应用目标节点。

<xsl:template match="ex:Record/ex:Item">
    <xsl:apply-templates select="ex:Document_to_be_Requested/*"/>
</xsl:template>

然后为目标节点创建模板

<xsl:template match="ex:Document_to_be_Requested/ex:Item">
    <ex:Item>
        <!-- copies the preceding siblings of parent node -->
        <xsl:copy-of select="../preceding-sibling::*"/>
        <ex:Document_to_be_Requested>
            <!-- copies the current node -->
            <xsl:copy-of select="."/>
        </ex:Document_to_be_Requested>
    </ex:Item>
</xsl:template>

整个样式表如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ex="http://archertech.com/Print/Export"
    version="2.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ex:Record/ex:Item">
        <xsl:apply-templates select="ex:Document_to_be_Requested/*"/>
    </xsl:template>

    <xsl:template match="ex:Document_to_be_Requested/ex:Item">
        <ex:Item>
            <xsl:copy-of select="../preceding-sibling::*"/>
            <ex:Document_to_be_Requested>
                <xsl:copy-of select="."/>
            </ex:Document_to_be_Requested>
        </ex:Item>
    </xsl:template>

</xsl:stylesheet>

查看实际情况here