我有以下XML
<group id="a">
<Name>Number One</Name>
<setgroup>
<refgroup ID="b">
<refgroup ID="c">
</setgroup>
</group>
<group id="b">
<Name>Number Two</Name>
<setgroup>
<refgroup ID="c">
<refgroup ID="e">
</setgroup>
</group>
<group id="c">
<Name>Number Three</Name>
<setgroup>
<refgroup ID="g">
<refgroup ID="f">
</setgroup>
</group>
作为输出我需要
<Product>
<Name>Number One</Name>
<Product>
<Name>Number Two</Name>
<Product>
<Name>Number Three</Name>
</Product>
</Product>
</Product>
基本上,只要我遍历该节点,我的新xml就不会再次包含在内。
所以我需要根据我的xslt
进行撤销到目前为止:
<Products>
<xsl:for-each select="*:PIMXMLExport[fn:namespace-uri() eq '']/*:group[fn:namespace-uri() eq '']">
<Product>
<Name>
<xsl:for-each select="(./*:Name[fn:namespace-uri() eq '']/node())[fn:boolean(self::text())]">
<xsl:sequence select="fn:string(.)"/>
</xsl:for-each>
</Name>
<xsl:for-each select="*:setgroup[fn:namespace-uri() eq '']/*:refgroup[fn:namespace-uri() eq '']">
<Product>
<Name>
<xsl:variable name="header_pos" select="@OIDRef"/>
<xsl:value-of select="/PIMXMLExport/group[@asimoid = $header_pos]/Name"/>
</Name>
</Product>
</xsl:for-each>
</Product>
</xsl:for-each>
</Products>
答案 0 :(得分:0)
如果您按照设计使用XSLT的方式使用XSLT,这是一个非常容易的问题之一:使用xsl:apply-templates和模板规则而不是嵌套的xsl:for-each和conditionals。
解决方案的关键方面是:
(a)处理 MyCustomPinHolder.info1 = "";
MyCustomPinHolder.info2 = "";
元素的模板规则:
<group>
(b)按ID
查找群组的密钥<xsl:template match="group">
<Product>
<xsl:copy-of select="Name"/>
<xsl:apply-templates/>
</Product>
</xsl:template>
(c)与refgroup元素匹配的模板规则:
<xsl:key name="gpKey" match="group" use="id"/>