2017-02-27 15 views
0

<?xml version="1.0" encoding="UTF-8"?> <Root xmlns="http://www.tcxml.org/Schemas/TCXMLSchema"> <TreeNode bbd="" id="TreeNodID" vid="VirtualID" /> <ChildNode bbd="bbd1" date="2017-02-22T15:04:32Z" object="ChildNodeID" thread="TreeNodID" /> </Root>XSLT: Finden Sie den Knoten mit Attributwert gleich einem anderen Attribut von einem anderen Knoten

Ich möchte eine Xslt schreiben, die die XML wie

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <TreeNode bbd="bbd1" id="TreeNodeID" vid="VirtualID" object="ChildNodeID" /> 
    <ChildNode bbd="bbd1" date=&quot;2017-02-22T15:04:32Z object="ChildNodeID" thread="TreeNodeID" /> 
</Root> 

umschreiben will ich möchte den Knoten finden /*/@thread mit Attribut eines beliebigen Knotens gleich dem Wert TreeNode/@id. Holen Sie den Wert @object Attribut des übereinstimmenden Knotens und füllen Sie ihn in TreeNode Element. Bekommen Sie auch den bbd Wert und füllen Sie ihn in TreeNode Element.

Mir ist nicht bekannt, ob der übereinstimmende Knoten ChildNode oder etwas anderes ist.

Wie kann ich das erreichen?

+0

Was ist Bedingung, Attribut von Childnode zu Treenode zu verschieben – Rupesh

+0

Erfahren Sie, wie Sie einen ** Schlüssel ** verwenden: https://www.xml.com/pub/a/2002/02/06/key-lookups.html –

Antwort

0

können Sie diese verwenden, auch

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:aa="http://www.tcxml.org/Schemas/TCXMLSchema"> 
    <xsl:output method="xml" indent="yes"/> 

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

    <xsl:template match="aa:TreeNode"> 
     <xsl:variable name="id" select="@id"/> 
     <xsl:copy> 
      <xsl:attribute name="bbd" select="//*[@thread eq $id]/@bbd"/> 
      <xsl:copy-of select="@*[normalize-space(.) ne '']"></xsl:copy-of> 
      <xsl:attribute name="object" select="//*[@thread eq $id]/@object"/> 
      <xsl:apply-templates select="node()"></xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Danke Rupesh. Es funktioniert für mich. – TechGuy

+0

Hallo Rupesh, aufgrund des Vorhandenseins von Attribut xmlns im Root-Knoten gibt es nicht das erwartete Ergebnis ... – TechGuy

+0

Definieren Sie diesen Namespace in xsl-Deklaration oder Erwähnung in Ihrer Frage für checking – Rupesh

0

Ich konnte dies mit folgenden Xslt tun `

<?xml version="1.0" encoding="utf-8"?> 
<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="TreeNode"> 
     <xsl:copy> 
      <xsl:if test="/*/node()/@[email protected]"> 
       <xsl:attribute name="object"> 
        <xsl:value-of select="/*/node()/@object"/> 
       </xsl:attribute> 
      </xsl:if>   
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

`

Der verbleibende Teil ist - wenn BBD existiert dann prüfen, ob Wert leer, dann füge Attribut hinzu und befülle den Wert, wenn es bereits mit einem Wert gefüllt ist, behalte es so wie es ist. andernfalls hinzufügen Attribut und füllen mit dem Wert.

Verwandte Themen