复制xml +删除一些位置节点

时间:2015-10-11 08:21:57

标签: xml xslt xslt-1.0

我需要在BizTalk中做一些事情。但它只是xslt所以我把它标记为xslt问题。

我有一个" multipart"输入信息(如下面的xml中所示" root& InputMessagePart_0"

我有以下xml作为输入。

<s0:Root xmlns:ns0="http://schemas.microsoft.com/BizTalk/2003/aggschema">
<InputMessagePart_0>
    <ns0:parentnode xmlns:ns0="http://schemas.microsoft.com/namespace1" >
        <ns0:childNode attribute1="test" attribute2="test">
            <levelA xmlns="http://schemas.microsoft.com/namespace2"/>
        </ns0:childNode>
        <ns0:childNode2 Name="childNode2">
            <levelA xmlns="http://schemas.microsoft.com/namespace3"/>
        </ns0:childNode2>
        <ns0:ChildNode3 Name="ChildNode3" id="2015-10-08-12.07.37.218960">
            <ns0:levelA Name="levelA">
                <ns0:data Name="Data" id="123456" type="A">
                </ns0:data>
                <ns0:data Name="Data" id="654321" type="B">
                </ns0:data>
                <ns0:levelAA id="910038265">
                    <ns0:repeatingItem id="910568755" >
                        <ns0:comm Name="Communication" id="910041726" numberOfDocuments="3">
                            <ns0:group Name="Group" id="12">
                                <ns0:doc archived="1" id="123" >
                                </ns0:doc>
                                <ns0:doc archived="1" id="321" >
                                </ns0:doc>
                            </ns0:group>
                        </ns0:comm>
                    </ns0:repeatingItem>
                    <ns0:repeatingItem id="123456789" >
                        <ns0:comm Name="Communication" id="910041726" numberOfDocuments="3">
                            <ns0:group conceptName="Group" id="34">
                                <ns0:doc archived="1" id="1234" >
                                </ns0:doc>
                                <ns0:doc archived="1" id="4321" >
                                </ns0:doc>
                            </ns0:group>
                        </ns0:comm>
                    </ns0:repeatingItem>
                    <ns0:repeatingItem id="987654321" >
                        <ns0:comm Name="Communication" id="910041726" numberOfDocuments="3">
                            <ns0:group Name="Group" id="56">
                                <ns0:doc archived="1" id="12345">
                                </ns0:doc>
                            </ns0:group>
                        </ns0:comm>
                    </ns0:repeatingItem>
                </ns0:levelAA>
                <ns0:OtherDoc id="123">
                    <ns0:Content/>
                </ns0:OtherDoc>
                <ns0:OtherDoc id="321">
                    <ns0:Content/>
                </ns0:OtherDoc>
                <ns0:OtherDoc id="1234">
                    <ns0:Content/>
                </ns0:OtherDoc>
                <ns0:OtherDoc id="4321">
                    <ns0:Content/>
                </ns0:OtherDoc>
            </ns0:data>
        </ns0:ChildNode3>
    </ns0:parentnode>
</InputMessagePart_0>
<InputMessagePart_1>
    <ns7:MessageInformation xmlns:ns7="http://Schemas.RepeatingItemMessageInformation">
        <RepeatingItemPosition>1</RepeatingItemPosition>
    </ns7:MessageInformation>
</InputMessagePart_1>

我在输出中需要的东西

<ns0:parentnode xmlns:ns0="http://schemas.microsoft.com/namespace1" >
<ns0:childNode attribute1="test" attribute2="test">
    <levelA xmlns="http://schemas.microsoft.com/namespace2"/>
</ns0:childNode>
<ns0:childNode2 Name="childNode2">
    <levelA xmlns="http://schemas.microsoft.com/namespace3"/>
</ns0:childNode2>
<ns0:ChildNode3 Name="ChildNode3" id="2015-10-08-12.07.37.218960">
    <ns0:levelA Name="levelA">
        <ns0:data Name="Data" id="123456" type="A">
        </ns0:data>
        <ns0:data Name="Data" id="654321" type="B">
        </ns0:data>
        <ns0:levelAA id="910038265">
            <ns0:repeatingItem id="910568755" >
                <ns0:comm Name="Communication" id="910041726" numberOfDocuments="3">
                    <ns0:group Name="Group" id="12">
                        <ns0:doc archived="0" id="123" >
                        </ns0:doc>
                        <ns0:doc archived="0" id="321" >
                        </ns0:doc>
                    </ns0:group>
                </ns0:comm>
            </ns0:repeatingItem>
        </ns0:levelAA>
        <ns0:OtherDoc id="123">
            <ns0:Content/>
        </ns0:OtherDoc>
        <ns0:OtherDoc id="321">
            <ns0:Content/>
        </ns0:OtherDoc>
    </ns0:data>
</ns0:ChildNode3>

我会解释它需要什么。

1)复制&#34; InputMessagePart_0&#34;

下的所有内容

然后例外:)

a)我只需要具有特定位置的repeatingItem(在输入中你看到&#34; InputMessagePart_1 / MessageInformation / repeatingItemPosition&#34;)。所以在这个例子的输出中我们只需要repeatItem&#34; 1&#34;。它总是1个数字。因此,当我们在BizTalk业务流程中循环时,它将是1或2或3或....

b)同样在&#34; repeatingItem / comm / group / doc&#34;属性&#34;已存档&#34;应始终设置为&#34; 0&#34;。

c)这是我不知道是否可能的事情。在&#34; OtherDoc&#34;我们有一些内容(base64生成的东西)。因为我们删除了其他不是所有的重复项目&#34; Otherdoc&#34;物品是必需的。只有与repeatItem doc中具有相同ID的那些。 (但这是否可以检查重复项目,然后删除我们不需要的OtherDoc。

我已经尝试了一些东西。但我无法让它发挥作用。下面你可以找到我用过的东西。但我还没(我希望)是一位xslt专家。 :)

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
                exclude-result-prefixes="msxsl var s0 s1" version="1.0"
                xmlns:ns0="http://schemas.microsoft.com/namespace1"
                xmlns:s0="http://schemas.microsoft.com/BizTalk/2003/aggschema"
                xmlns:s7="http://Schemas.RepeatingMessageInformation">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />     

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

<!-- Copy the n-th repeatingItem element-->
<xsl:template match="ns0:repeatingItem[number(s0:Root/InputMessagePart_1/s7:MessageInformation/repeatingItemPosition/text())]">
  <xsl:apply-templates select="current()"/>
</xsl:template>

<!-- Don't copy the other repeatingItem elements-->
<xsl:template match="ns0:repeatingItem[position()!=s0:Root/InputMessagePart_1/s7:MessageInformation/repeatingItemPosition/text()]"/>

<xsl:template match="ns0:doc">
  <ns0:doc>
    <xsl:copy-of select="@*[local-name()!='archived']"/>
    <xsl:attribute name="archived">0</xsl:attribute>
  </ns0:doc>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

在谓词中,上下文节点发生更改,因此match="ns0:repeatingItem[number(s0:Root/InputMessagePart_1/s7:MessageInformation/repeatingItemPosition/text())]"需要match="ns0:repeatingItem[number(/s0:Root/InputMessagePart_1/s7:MessageInformation/repeatingItemPosition/text())]"才能确保谓词不会查找s0:Root的{​​{1}}个孩子。

但我不明白为什么你需要那个模板,如果你想复制那个元素,那么你已经拥有的身份转换模板就会进行复制。我认为,做ns0:repeatingItem会导致无限递归,所以这不太可能是你想要的。

然后将<xsl:apply-templates select="current()"/>更正为<xsl:template match="ns0:repeatingItem[position()!=s0:Root/InputMessagePart_1/s7:MessageInformation/repeatingItemPosition/text()]"/>

最后我想你要添加

<xsl:template match="ns0:repeatingItem[position()!=/s0:Root/InputMessagePart_1/s7:MessageInformation/repeatingItemPosition]"/>

将这些建议结合起来并修复元素名称或命名空间名称的一些问题我得到了

<xsl:template match="ns0:ChildNode3/ns0:levelA/ns0:OtherDoc[not(@id = ancestor::ns0:ChildNode3/descendant::ns0:repeatingItem[number(/s0:Root/InputMessagePart_1/s7:MessageInformation/repeatingItemPosition)]//ns0:OtherDoc/@id)]"/>

http://xsltransform.net/ncdD7kX在线。