2013-09-28 81 views
0

我有一個xml文件,其結構如下所示。遞歸xml,如何根據子元素的條件選擇元素

問:我如何選擇/查詢那些孩子的總和(金額)不等於自己的金額的元素?

沒有固定數量的孩子,甚至有沒有孩子的元素,這些後來的元素不應該出現在選擇中。

從JSON bubbletree文件產生

文件結構:

'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="JSON"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="label"/> 
     <xs:element ref="amount"/> 
     <xs:element ref="color"/> 
     <xs:element maxOccurs="unbounded" ref="children"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="label" type="xs:string"/> 
    <xs:element name="amount" type="xs:integer"/> 
    <xs:element name="color" type="xs:string"/> 
    <xs:element name="children"> 
    <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="amount"/> 
     <xs:element ref="children"/> 
     <xs:element ref="color"/> 
     <xs:element ref="label"/> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
    </xs:schema>' 

從BubbleChart中JSON文件引起的。

的元素後,我在那裏一個標籤與「X」(手動放澄清,是不是有在現實的文件)在下面的XML文件開始:

'<?xml version="1.0" encoding="UTF-8"?> 
    <JSON> 
    <label>total</label> 
    <amount>30</amount> 
    <children> 
     <label>x 1</label> 
     <amount>10</amount> 
      <children> 
       <label>1.1</label> 
       <amount>5</amount> 
      </children> 
      <children> 
       <label>1.2</label> 
       <amount>6</amount> 
      </children> 
    </children> 
    <children> 
     <label>2</label> 
     <amount>10</amount> 
      <children> 
       <label>2.1</label> 
       <amount>5</amount> 
      </children> 
      <children> 
       <label>x 2.2</label> 
       <amount>5</amount> 
        <children> 
         <label>2.2.1</label> 
         <amount>3</amount> 
        </children> 
        <children> 
         <label>2.2.2</label> 
         <amount>1</amount> 
        </children> 
        <children> 
         <label>2.2.3</label> 
         <amount>3</amount> 
        </children> 
      </children> 
    </children> 
    <children> 
     <label>x 3</label> 
     <amount>10</amount> 
      <children> 
       <label>3.1</label> 
       <amount>5</amount> 
      </children> 
      <children> 
       <label>3.2</label> 
       <amount>6</amount> 
      </children> 
    </children> 
    </JSON>' 
+0

你想處理一個元素或僅其子的後裔? –

+0

我想循環遍歷整個文件,並且我希望每個節點的金額值不等於其子元素中金額的總和。每個子元素都是新循環的基礎。 – Rense

回答

1

試試這個表達式以選擇所有子元素,孩子自己,其中所述的量不等於孩子的總和等於

<xsl:apply-templates select="//children[children][amount != sum(children/amount)]" /> 

例如,與此XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="//children[children][amount != sum(children/amount)]" /> 
    </xsl:template> 

    <xsl:template match="children"> 
     <children><xsl:value-of select="label" /></children> 
    </xsl:template> 
</xsl:stylesheet> 

以下兒童選擇

<children>x 1</children> 
<children>x 2.2</children> 
<children>x 3</children> 
+0

感謝蒂姆,這非常好! – Rense