处理嵌套节点的最佳方法(名称不同,内容相同)

Optimal method to handle nesting nodes (Different name, same content)

我必须转换看起来类似于下面的 xml 消息。 每个节点的源内容实际上是相同的,具有不同的节点名称(parentitem、childitem、subchild)。

我继承了一个 XSLT,它通过几乎不使用模板对每个案例进行硬编码来解决该解决方案,其中有大量重复的 XSLT。

我想知道我有哪些选项可以优化 XSLT 以减少 XSLT 的重复。

我尝试为通用“节点”设置单个模板;然后尝试使用调用模板; 但是我无法弄清楚如何在 generic

中嵌套对象

感谢任何帮助,谢谢。

<item>
    <itemdetail>
        <parentitem>
            <item>001</item>
            <code1>1</code1>
            <code2>2</code2>
            <itemattribute>
                <item_desc>ParentItem</item_desc>
            </itemattribute>
        </parentitem>
        <childitem>
            <item>002</item>
            <code1>2</code1>
            <code2>2</code2>
            <itemattribute>
                <item_desc>ChildItemLevel1</item_desc>
            </itemattribute>
        </childitem>
        <subchildren>
            <subchild>
                <item>003</item>
                <code1>2</code1>
                <code2>1</code2>
                <itemattribute>
                    <item_desc>SubChild003</item_desc>
                </itemattribute>
            </subchild>
            <subchild>
                <item>004</item>
                <code1>2</code1>
                <code2>1</code2>
                <itemattribute>
                    <item_desc>SubChild004</item_desc>
                </itemattribute>
            </subchild>
        </subchildren>
    </itemdetail>
</item>

消息有一些变化 所需的转换需要类似于以下内容。

Case parentitem Node ChildItem Present SubChildren Present
Case 1 Y Y Y
Case 2 Y N N
Case 3 Y Y N
Case 4 N Y N
Case 5 N Y Y
Case 6 N N Y

案例一

<Products>
        <Product type="parentitem">
            <item>001</item>
            <code1>1</code1>
            <code2>2</code2>
            <itemattribute>
                <item_desc>parentitem</item_desc>
            </itemattribute>
            <Product type="childitem">
                <item>002</item>
                <code1>2</code1>
                <code2>2</code2>
                <itemattribute>
                    <item_desc>childitem</item_desc>
                </itemattribute>
                <Product type="subchild">
                    <item>003</item>
                    <code1>2</code1>
                    <code2>1</code2>
                    <itemattribute>
                        <item_desc>SubChild003</item_desc>
                    </itemattribute>
                </Product>
                <Product type="subchild">
                    <item>004</item>
                    <code1>2</code1>
                    <code2>1</code2>
                    <itemattribute>
                        <item_desc>SubChild004</item_desc>
                    </itemattribute>
                </Product>
            </Product>
        </Product>
</Products>

案例二

<Products>
        <Product type="parentitem">
            <item>001</item>
            <code1>1</code1>
            <code2>2</code2>
            <itemattribute>
                <item_desc>parentitem</item_desc>
            </itemattribute>
        </Product>
</Products>

案例三

<Products>
        <Product type="parentitem">
            <item>001</item>
            <code1>1</code1>
            <code2>2</code2>
            <itemattribute>
                <item_desc>parentitem</item_desc>
            </itemattribute>
            <Product type="childitem">
                <item>002</item>
                <code1>2</code1>
                <code2>2</code2>
                <itemattribute>
                    <item_desc>childitem</item_desc>
                </itemattribute>
                </Product>
            </Product>
        </Product>
</Products>

这样的事情对你有用吗?我相信它涵盖的案例比你阐述的 6 个还要多。

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="itemdetail">
    <Products>
        <xsl:apply-templates select="parentitem"/>
        <xsl:apply-templates select="childitem[not(../parentitem)]"/>
        <xsl:apply-templates select="subchildren[not(../parentitem | ../childitem)]"/>
    </Products>
</xsl:template>

<xsl:template match="parentitem">
    <Product type="parentitem">
        <xsl:copy-of select="*"/>
        <xsl:apply-templates select="../childitem"/>
        <xsl:apply-templates select="../subchildren[not(../childitem)]"/>
    </Product>
</xsl:template>

<xsl:template match="childitem">
    <Product type="childitem">
        <xsl:copy-of select="*"/>
        <xsl:apply-templates select="../subchildren"/>
    </Product>
</xsl:template>

<xsl:template match="subchild">
    <Product type="subchild">
        <xsl:copy-of select="*"/>
    </Product>
</xsl:template>

</xsl:stylesheet>