2014-03-14 116 views
1

我有下面的XML文件:如何根據元素條件提取的值進行排序

<?xml version="1.0" encoding="UTF-8"?> 
<gbXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.gbxml.org/schema xsi.xsd"xmlns="http://www.gbxml.org/schema" 
temperatureUnit="C" lengthUnit="Meters" areaUnit="SquareMeters"volumeUnit="CubicMeters" 
useSIUnitsForResults="true" version="0.37"> 

<Pared id="Pa-1" paredType="Shade">  
<Name>P-S-1</Name> 
<Order> 
    <Direction>0.000000</Direction> 
    <Angle>90.000000</Angle> 
    <Height>3.657818</Height> 
    <Width>15.200000</Width> 
</Order> 
</Pared> 
<Pared id="Pa-2" paredType="Shade">  
    <Name>P-S-2</Name> 
    <Order> 
     <Direction>90.000000</Direction> 
     <Angle>90.000000</Angle> 
     <Height>2.598076</Height> 
     <Width>14.200000</Width> 
    </Order> 
</Pared> 
</gbXML> 

我想提取的「高度」,每個「美嘉ID」的「寬度」值,並根據他們整理到「方向」和「角度」值。例如,在「拉帕雷德ID =‘帕-1’,如果‘方向’= 0.000000和‘角度’= 90.000000,則寬度和高度的提取的值的順序應爲:

(Width, 0.00) 
(Width, Height) 
(0.00, Height) 
(0.00, 0.00) 

我是新來XSLT和我知道如何選擇寬度的價值觀,並且高度:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:gb="http://www.gbxml.org/schema"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 

<xsl:template match= "gb:Pared"> 
<xsl:value-of select="gb:Order/gb:Height/> 

但我不知道如何像我之前提到的這些手工排序,我會很感激,如果有人可以幫助我與此

我想要下面的輸出(應用我前面提到的條件):

從拉帕雷德ID = 「帕-1:

(15.200000, 0.000000) 
(15.200000, 3.657818) 
(0.000000, 3.657818) 
(0.000000, 0.000000) 

從拉帕雷德ID =」 PA-2:

(0.000000, 0.000000) 
(14.200000, 0.000000) 
(14.200000, 2.598076) 
(0.000000, 2.598076) 

把它看成是壁座標X,Y。兩個牆不能有相同的座標,高度和寬度的值就像座標值一樣。根據牆的「方向」和「角度」,這些座標是如何配對的。 由於描述該牆的4個X,Y點,您有0.000個座標值。因此,Pa-1和Pa-2不能有相同的座標,但它們可能在一個座標上相連。就像如果有兩個壁比形成一個L形,0.00,0.00可以是Pa-1的右底座標,但是如果Pa-2的情況下,0.00,0.00是左底座標。

回答

0

不知道我是否理解正確。以下XSL輸出寬度和高度值,按照「方向」然後「角度」(數字,升序)排序的「Pared」部分進行分組。

只需要小心,在你的XML例子中,我不得不用一個空格分隔一些gbXML的屬性(否則它不是有效的XML)。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
xmlns:ns0="http://www.gbxml.org/schema"> 
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <xsl:for-each select='//ns0:Pared' > 
      <xsl:sort select=".//ns0:Direction" data-type='number' order="ascending"/> 
      <xsl:sort select=".//ns0:Angle"  data-type='number' order="ascending"/> 
-- Pared: <xsl:value-of select="@id" /> 
(<xsl:value-of select=".//ns0:Width" />,0.00) 
(<xsl:value-of select=".//ns0:Width" />,<xsl:value-of select=".//ns0:Height" />) 
(0.00,<xsl:value-of select=".//ns0:Height" />) 
(0.00,0.00) 
</xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

給人

-- Pared: Pa-1 
(15.200000,0.00) 
(15.200000,3.657818) 
(0.00,3.657818) 
(0.00,0.00) 

-- Pared: Pa-2 
(14.200000,0.00) 
(14.200000,2.598076) 
(0.00,2.598076) 
(0.00,0.00) 
+0

謝謝您的答覆。是的,我只複製了XML文件的一部分原因。當它只有我在那裏的兩個「Pared」元素時,您的代碼纔有效。在完整的XML文件中,我有更多的「Pared」元素,其中一些具有相同的「方向」和「角度」值,但具有不同的「高度」和「寬度」值。我沒有把所有22個Pared元素放在一起,因爲我認爲要理解我想要的東西會非常困惑。自從我有了一個想法以後,你的代碼會有很大幫助,只需要解決我之前提到的問題。再次感謝你! – LillieG

相關問題