2013-12-10 183 views
-1

蒂姆 - 谢谢!您根据我的输入提供的内容当然可行!然而,我却是我自己的自我的牺牲品。我最初的输入是我的实际XML文件的结构缩小版本,我想我能够应用你的帮助的概念,并得到我最终需要的东西......猜猜看是什么?尽管变化很小,但我依然不能。代码的一些很好的变化/调整,包括在“copy-of select =”中使用完整路径,不会将KEY放在DOCUMENT下。它唯一的工作方式是当我使用“xsl:copy-of select =”// KEY“/”时。移动父级元素到循环组的子元素

我遇到的另一个问题是如何确保只有“文档”所在的“KEY”被复制到该“文档”下...使用“原样”代码,将所有元素XML被复制到每个节点(同样,只有当我使用“//”运算符时)。

请帮忙。

这里是我的未按比例缩小的结构:

<?xml version='1.0' encoding='utf-8' ?> 
<Root> 
     <Level1> 
       <KEY><![CDATA[keyword1]]></KEY> 
       <Documents> 
          <Document> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string11]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string12]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string13]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
     <Level1> 
       <KEY><![CDATA[keyword2]]></KEY> 
       <Documents> 
          <Document> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string21]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string22]]></IMAGE> 
          </Document> 
          <Document> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string23]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
</Root> 

我想要的结果:

<?xml version='1.0' encoding='utf-8' ?> 
<Root> 
     <Level1> 
       <Documents> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string11]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string12]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword1]]></KEY> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string13]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
     <Level1> 
       <Documents> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type1</TYPE> 
            <IMAGE><![CDATA[string21]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type2</TYPE> 
            <IMAGE><![CDATA[string22]]></IMAGE> 
          </Document> 
          <Document> 
            <KEY><![CDATA[keyword2]]></KEY> 
            <TYPE>type3</TYPE> 
            <IMAGE><![CDATA[string23]]></IMAGE> 
          </Document> 
       </Documents> 
     </Level1> 
</Root> 

对不起......,并再次感谢你。

+0

你为什么不有什么不工作了吗?你真的尝试过什么? – Hilikus

回答

1

首先,你需要在identity transform读了,它看起来像这样

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

这将所有输出文件的拷贝节点没有改变。这意味着你只需要为你需要改变的东西编写模板。

你也不应该真的想到移动元素,而是两个变化;从文档元件下除去KEY元件,然后将文献下添加新KEY元件(即现有的一个的副本)。

删除KEY元素是直截了当的。只是比赛了,什么事都不做

<xsl:template match="KEY" /> 

文档元素下添加新的元素,也是直截了当。您需要一个与模板匹配的模板,该模板与身份模板类似,但具有额外的副本,可以从父级复制KEY节点。

<xsl:template match="Document"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:copy-of select="../KEY" /> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

所以,你复制文件元素,整个复制的属性(如果有的话),从父复制KEY,然后继续处理子节点。

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="KEY" /> 

    <xsl:template match="Document"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:copy-of select="../KEY" /> 
     <xsl:apply-templates select="node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

编辑:作为替代方案,如果KEY不是父节点的孩子,但可以在任何深度,尝试用这个,而不是替换副本声明

<xsl:copy-of select="ancestor::*[KEY]/KEY" /> 

这应该与文档元件是在任何级别对​​应。

0

好的,最后....这是蒂姆的原始xsl(有一个微小的调整),这给了我想要的结果。蒂姆 - 再次感谢。 XSLT超出了我的专业领域。我只是想用它的“准备”工具:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 

<xsl:template match="KEY" /> 

<xsl:template match="Document"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:copy-of select="../../KEY" /> 
    <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

我已经对我的原始答案进行了编辑,以处理** Document **元素嵌套到更深层次的问题,因此将使用原始XML和最新示例。 –