【问题标题】:Convert XML to XML for Each Item将每个项目的 XML 转换为 XML
【发布时间】:2018-12-13 19:29:31
【问题描述】:

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

原创

<?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:Item>C</ex:Item>
            <ex:Item>D</ex:Item>
            <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:Item>B</ex:Item>
            <ex:Item>F</ex:Item>
            <ex:Item>G</ex:Item>
        </ex:Document_to_be_Requested>
    </ex:Item>
</ex:Record>

希望

<?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>

提前致谢!

【问题讨论】:

  • 这不是编码服务。如果您有特定的问题或困难,请向我们展示您所做的并指出。 -- 请注意,您显示的输入不是格式良好的 XML,并且根本无法由 XSLT 处理(没有单个根元素,并且前缀未绑定到命名空间)。
  • 根被切断了,和第二个一样
  • 你能不能至少给我一个关于从哪里开始的提示。我已经尝试了 2 天,但我显然误解了有关 XSLT 的一些东西,它会阻止 if 工作。
  • 这对我来说似乎很基本:为每个 ex:Item/ex:Document_to_be_Requested/ex:Item 创建一个项目并从祖先 ex:Item 节点复制一些节点。

标签: xml xslt foreach


【解决方案1】:

从身份模板开始

<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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多