2013-04-22 96 views
1

下面是我的XML的结构。通过xslt中的子节点值创建父节点的副本

<Client> 
    <Document> 
    <service class="ABC"> 
     <author name="p"/> 
     <title>t1</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="XYZ"> 
     <author name="a"/> 
     <title>t2</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="PQR"> 
     <author name="x"/> 
     <title>t3</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
</Client> 

我想创建标题为“t2”但无法找出解决方案的文档节点的副本。输出应该看起来像

<Client> 
    <Document> 
    <service class="ABC"> 
     <author name="p"/> 
     <title>t1</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="XYZ"> 
     <author name="a"/> 
     <title>t2</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="PQR"> 
     <author name="x"/> 
     <title>t3</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
    <Document> 
    <service class="XYZ"> 
     <author name="a"/> 
     <title>t2</title> 
     <Details> 
     ... 
     </Details> 
    </service> 
    </Document> 
</Client> 

谢谢你的帮助,我们非常感谢。

回答

1

这个简单的样式表的做这件事的方法之一:

<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"/> 

    <!-- 
    Identity transform 
    See http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT 
    --> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Override identity transform to process <Client> element --> 
    <xsl:template match="Client"> 
    <!-- Copy current element into output --> 
    <xsl:copy> 
     <!-- Apply attributes and child nodes --> 
     <xsl:apply-templates select="@* | node()"/> 
     <!-- Apply all <Document> elements with <title> whose value is "t2" --> 
     <xsl:apply-templates select="Document[service/title = 't2']"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
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:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- Override identity transform to process <Client> element --> 
<xsl:template match="Client"> 
    <!-- Copy current element into output --> 
    <xsl:copy> 
     <!-- Apply attributes and child nodes --> 
     <!-- Apply all <Document> elements with <title> whose value is "t2" --> 
     <xsl:apply-templates select="Document[service/title = 't2']"/> 
    </xsl:copy> 
</xsl:template> 

输出结果为:

<?xml version="1.0" encoding="utf-8"?> 
<Client> 
    <Document> 
     <service class="XYZ"> 
      <author name="a"/> 
      <title>t2</title> 
      <Details> 
       ... 
      </Details> 
     </service> 
    </Document> 
</Client> 
+0

你说'对于这条线:本来是正确的,但是你没有把你认为是错误的那条线。我假设它是'',因为这是我看到的唯一区别。但是,通过删除该行,您的输出现在与OP所要求的不同。请参阅原始问题中的输出应该看起来像''。 – 2015-11-24 16:13:49