具有名称空间的多级xml的XML转换

时间:2018-07-20 19:23:30

标签: xml xslt-1.0

我有一个带有多个子节点的XML文件。
我需要将一个节点复制到另一个节点,以便将Excel读为简单的任务(我无需循环到多个子节点)。

我的示例XML如下。

<MultiBlock xmlns="x-schema:ConfigFileSchema.xml">
    <Block>
        <BlockDef>
            <BlockName>Block1</BlockName>
            <EntityName>Block1</EntityName>
            <TemplateName>SYSTEM:template1</TemplateName>
        </BlockDef>
        <Parameters>
            <Parameter>
                <ParamName>PARAM1</ParamName>
                <ParamValue>PARAM1VALUE</ParamValue>
            </Parameter>
            <Parameter>
                <ParamName>PARAM2</ParamName>
                <ParamValue>PARAM2VALUE</ParamValue>
            </Parameter>
            ...
            ...
            <Parameter>
                <ParamName>PARAMn</ParamName>
                <ParamValue>PARAMnVALUE</ParamValue>
            </Parameter>
        </Parameters>
        <EmbBlocks>
            <Block>
                <BlockDef>
                    <BlockName>EMBBLOCK1</BlockName>
                    <EntityName>Block1</EntityName>
                    <TemplateName>SYSTEM:template1</TemplateName>
                </BlockDef>
                <Block>
                    <Parameters>
                        <Parameter>
                            <ParamName>PARAM1</ParamName>
                            <ParamValue>PARAM1VALUE</ParamValue>
                        </Parameter>
                        <Parameter>
                            <ParamName>PARAM2</ParamName>
                            <ParamValue>PARAM2VALUE</ParamValue>
                        </Parameter>
                        ...
                        ...
                        <Parameter>
                            <ParamName>PARAMn</ParamName>
                            <ParamValue>PARAMnVALUE</ParamValue>
                        </Parameter>
                    </Parameters>
                </Block>
            </Block>
            ...
            ...
            <Block>...</Block>
        </EmbBlocks>
    </Block>
</MultiBlock>

我要复制

  1. BlockNameTemplateNameMultiBlock\Block\BlockDef\BlockNameMultiBlock\Block\BlockDef\TemplateNameMultiBlock\Block\Parameters

  2. 分别从BlockNameTemplateNameMultiBlock\Block\EmbBlocks\Block\BlockDef\BlockName的{​​{1}}和MultiBlock\Block\EmbBlocks\Block\BlockDef\TemplateName

我尝试了至少使用下面的XSL复制BlockName。但是输出为空。我无法理解可能出了什么问题。请引导我。

MultiBlock\Block\EmbBlocks\Parameters

感谢您的阅读:)

1 个答案:

答案 0 :(得分:0)

输入XML具有与之关联的命名空间x-schema:ConfigFileSchema.xml,该命名空间需要在XSL中进行映射才能正确访问元素。 XSLT元素现在应该看起来像

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="x-schema:ConfigFileSchema.xml">

节点<Parameters>的XPath与<BlockName><TemplateName>节点有关时是不同的。因此,必须使用不同的模板分别处理此元素。

模板1-> <Parameters>内的<MultiBlock>

<xsl:template match="ns0:MultiBlock/ns0:Block/ns0:Parameters">
    <xsl:copy>
        <xsl:apply-templates select="../ns0:BlockDef/ns0:BlockName" />
        <xsl:apply-templates select="../ns0:BlockDef/ns0:TemplateName" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

模板2-> <Parameters>内的<EmbBlocks>

<xsl:template match="ns0:MultiBlock/ns0:Block/ns0:EmbBlocks/ns0:Block/ns0:Block/ns0:Parameters">
    <xsl:copy>
        <xsl:apply-templates select="../../ns0:BlockDef/ns0:BlockName" />
        <xsl:apply-templates select="../../ns0:BlockDef/ns0:TemplateName" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

完成XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="x-schema:ConfigFileSchema.xml">
    <xsl:output method="xml" />
    <xsl:strip-space elements="*" />

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

    <xsl:template match="ns0:MultiBlock/ns0:Block/ns0:Parameters">
        <xsl:copy>
            <xsl:apply-templates select="../ns0:BlockDef/ns0:BlockName" />
            <xsl:apply-templates select="../ns0:BlockDef/ns0:TemplateName" />
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ns0:MultiBlock/ns0:Block/ns0:EmbBlocks/ns0:Block/ns0:Block/ns0:Parameters">
        <xsl:copy>
            <xsl:apply-templates select="../../ns0:BlockDef/ns0:BlockName" />
            <xsl:apply-templates select="../../ns0:BlockDef/ns0:TemplateName" />
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出

<MultiBlock xmlns="x-schema:ConfigFileSchema.xml">
    <Block>
        <BlockDef>
            <BlockName>Block1</BlockName>
            <EntityName>Block1</EntityName>
            <TemplateName>SYSTEM:template1</TemplateName>
        </BlockDef>
        <Parameters>
            <BlockName>Block1</BlockName>
            <TemplateName>SYSTEM:template1</TemplateName>
            <Parameter>
                <ParamName>PARAM1</ParamName>
                <ParamValue>PARAM1VALUE</ParamValue>
            </Parameter>
            <Parameter>
                <ParamName>PARAM2</ParamName>
                <ParamValue>PARAM2VALUE</ParamValue>
            </Parameter>
            <Parameter>
                <ParamName>PARAMn</ParamName>
                <ParamValue>PARAMnVALUE</ParamValue>
            </Parameter>
        </Parameters>
        <EmbBlocks>
            <Block>
                <BlockDef>
                    <BlockName>EMBBLOCK1</BlockName>
                    <EntityName>Block1</EntityName>
                    <TemplateName>SYSTEM:template1</TemplateName>
                </BlockDef>
                <Block>
                    <Parameters>
                        <BlockName>EMBBLOCK1</BlockName>
                        <TemplateName>SYSTEM:template1</TemplateName>
                        <Parameter>
                            <ParamName>PARAM1</ParamName>
                            <ParamValue>PARAM1VALUE</ParamValue>
                        </Parameter>
                        <Parameter>
                            <ParamName>PARAM2</ParamName>
                            <ParamValue>PARAM2VALUE</ParamValue>
                        </Parameter>
                        <Parameter>
                            <ParamName>PARAMn</ParamName>
                            <ParamValue>PARAMnVALUE</ParamValue>
                        </Parameter>
                    </Parameters>
                </Block>
            </Block>
            <Block />
        </EmbBlocks>
    </Block>
</MultiBlock>