2016-10-08 2 views
1

Ich habe einen XML-Code, der wie folgt aussieht,XPath ignoriert Geschwister, die nicht Attributwert überein

<?xml version="1.0"?> 
<root> 
<properties> 
    <property name="Name">Ananth</property> 
    <property name="Age">34</property> 
    <property name="Gender">Male</property> 
    <property name="Description">Blah blah</property> 
    100 other properties 
</properties> 
<properties> 
    <property name="Name">Peter</property> 
    <property name="Age">10</property> 
    <property name="Gender">Male</property> 
    <property name="Description">Blah blah</property> 
    100 other properties 
</properties> 
</root> 

Ich versuche Eigenschaften zu erhalten, die nur mit dem Namen & Alter ignoriert andere Geschwister Spiele Attribut.

//Property[@name='Name' or @name='Age']/.. 
//Property[@name='Name' or @name='Age']/parent::properties 

Bekommt mich nicht, wonach ich suche. Was wäre die beste XPath-Ausdruck sein, der mich so etwas wie

<?xml version="1.0"?> 
<properties> 
    <property name="Name">Ananth</property> 
    <property name="Age">34</property> 
</properties> 
<properties> 
    <property name="Name">Peter</property> 
    <property name="Age">10</property> 
</properties> 
+0

XPath kann nicht auswählen, was nicht bereits in der XML-Eingabe vorhanden ist. Ihre anvisierten Eigenschaftenelemente sind in der XML-Eingabe nicht vorhanden. – kjhughes

+0

Danke für das Hinweis auf die andere Frage. –

Antwort

0

Durch die Ausgabe, die Sie erwarten, geben würde, ich sehe, Sie erwarten nicht den ursprünglichen properties Knoten zu erhalten, aber nur die property passenden Knoten, weil die ursprüngliche properties Knoten verfügt über 100 Eigenschaften und die erwartete Ausgabe properties Knoten hat nur 2.

So haben Sie eine Doppel XPath brauchen, um richtig die erwartete Ausgabe zu erhalten:

Erstens:

properties/property[@name='Name' or @name='Age']/.. 

Dann wird für jeden angepaßten properties Knoten, eine Transformation:

property[@name='Name' or @name='Age'] 

(Beachten Sie, dass ein XPath-Ausdruck eine einfache Liste von null oder mehr Knoten zurückkehren würde, aber keine Baumstruktur von Knoten, wie Sie vielleicht erwarten).

Wenn es beabsichtigt ist, Teil eines XSL-Stylesheet, das komplette Sheet so sein würde zu sein:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" version="1.0" encoding="ISO-8859-1"/> 

<xsl:template match="/root"> 
<xsl:apply-templates select="properties/property[@name='Name' or @name='Age']/.."/> 
</xsl:template> 

<xsl:template match="properties"> 
<properties> 
<xsl:apply-templates select="property[@name='Name' or @name='Age']"/> 
</properties> 
</xsl:template> 

<xsl:template match="property"> 
<xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

aktualisiert

Wenn Sie nur properties Knoten filtern, Ihr erster Versuch soll Denken Sie daran,

//property[@name='Name' or @name='Age']/.. 

nur, dass XPath (als XML) ist Fall sensi: Arbeit: property in Ihrer Eingabe XML ist Kleinbuchstaben, und so muss in der Xpath-Ausdruck sein.

+0

Ich versuche nicht, ein XSLT zu machen. Ich versuche nur, die anderen Eigenschaften, die nicht den Attributen entsprechen, mit xpath, expression zu filtern. –

+0

Ich verstehe. Lies mein Update dann. –

Verwandte Themen