XSLT:复制所有,但“剪切和粘贴”部分内容(XSLT: Copy All, but 'cu

2019-10-21 03:39发布

背景

我的问题的更一般的版本是最近发布的 ,但由于岗位的质量,没有收到任何答复。 这里是我的尝试!

我有我想要转换以下XML结构

前处理XML

<schema>

    <!-- element to be imbedded -->

    <element name="tryCatch.catch">
        <complexType>
            <complexContent>
                <extension base="escalateContainer">
                    <attribute name="var" type="_var" />
                </extension>
            </complexContent>
        </complexType>
    </element>

    <complexType name="tryCatch">
        <complexContent>
            <extension base="scriptElement">
                <sequence>
                    <element name="try" type="escalateContainer" />
                    <element name="catch" type="tryCatch.catch" minOccurs="0" />
                    <element name="finally" type="escalateContainer" minOccurs="0" />
                </sequence>
            </extension>
        </complexContent>
    </complexType>

</schema>

......进入结构如下:

后XSLT的结构

<schema>

    <complexType name="tryCatch">
        <complexContent>
            <extension base="scriptElement">
                <sequence>
                    <element name="try" type="escalateContainer" />

                    <!-- Change here! -->

                    <element name="tryCatch.catch" minOccurs="0">
                        <complexType>
                            <complexContent>
                                <extension base="escalateContainer">
                                    <attribute name="var" type="_var" />
                                </extension>
                            </complexContent>
                        </complexType>

                    </element>
                    <element name="finally" type="escalateContainer" minOccurs="0" />
                </sequence>
            </extension>
        </complexContent>
    </complexType>

</schema>

过程概述

基本上,我只是想

  1. 复制一切
  2. 然后,找到所有element为a的complexType有一个. 在它们的类型 (由建设-我已经确保这种模式工作interally在我的XML)。 我比赛的简化版本是:

    complexType.element.type = element.name

  3. 最后,更换相应的全局元素的元素。 如果正在替换奖励点元素的属性也被复制。

我至今

<xsl:template match="@* | node()">

        <xsl:copy>

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

        </xsl:copy>

</xsl:template>

<xsl:template match="schema">

    <xsl:for-each select="element">

        <xsl:variable name="self" select="current()" />

        <xsl:variable name="name" select="@name" />

        <xsl:for-each select="/schema/complexType//element[@type=$name]">   

            <xsl:copy-of select="$self" />

        </xsl:for-each>         

    </xsl:for-each>

</xsl:template>

我想我要到正确的开始 - 所有内容复制与身份模板,然后再处理什么,我想改变。 问题是,我的第二个模板返回复制的元素! 本场比赛似乎工作的伟大,我只是失去了所有我想要保留其他内容。

Answer 1:

一般使用for-each是不是最好的主意。 它使模板不灵活,难以阅读。 (当然有时你无法避免,但在这种情况下是可以的。)您应使用假迭代XSLT引擎apply-templates 。 我会做这样的事情:

<xsl:template match="@* | node()" priority="-1"> <!-- copy everything unless another template with higher priority says otherwise -->
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
</xsl:template>

<xsl:template match="schema"> 
   <xsl:copy> <!-- copy the <schema> element -->
    <xsl:apply-templates select="complexType"/> <!-- copy all complexType elements within schema -->
   </xsl:copy>
</xsl:template>

<xsl:template match="element[contains(@type, '.')]"> <!-- if we encounter an <element> whose name contains the '.' character -->
        <xsl:variable name="type" select="@type" />
    <xsl:apply-templates select="//element[@name=$type]"/> <!-- copy the matching element instead -->
</xsl:template>

更新:我刚刚意识到我@type@name混合起来,固定的。



文章来源: XSLT: Copy All, but 'cut-and-paste' some content
标签: xml xslt