2014-04-18 96 views
1

我剛開始玩XLS轉換 - 我想用它們來在我的項目中添加額外的抽象層。 我想使用轉換將由水晶報告生成的xml文件轉換爲另一個xml,爲我的項目簡化(所以將來,當文件模式將改變時,我只需要更改我的xsl文件)。XLS轉換,請求子節點數據

所以我的XML輸入文件看起來像這樣:

<CrystalReport xmlns="urn:crystal-reports:schemas:report-detail" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd"> 
    <Group Level="1"> 
     <GroupHeader> 
      <Section SectionNumber="0"> 
       <Field Name="Field4" FieldName="{@PartIndex}"><FormattedValue>Part Number</FormattedValue><Value>51-01672</Value></Field> 
      </Section> 
      <Section SectionNumber="1"> 
       <Text Name="Text28"><TextValue>Part Description</TextValue> 
       </Text> 
      </Section> 
      <Section SectionNumber="2"> 
       <Text Name="Text21"><TextValue>Part Description 2</TextValue> 
       </Text> 
      </Section> 
      <Section SectionNumber="3"> 
      </Section> 
... 

這只是其中的一部分。我應該提到的是GroupHeader節點不會在組節點內重複。

所以我做了一些早期的XSL定義(測試緣故):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:t="urn:crystal-reports:schemas:report-detail" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/t:CrystalReport"> 
    <ToolsUsage> 
     <xsl:value-of select="t:Group[1]/@Level"/> 
    </ToolsUsage> 
</xsl:template> 

</xsl:stylesheet> 

我用Python的lxml的LIB進行測試。 此,如下面的代碼預期收益:

<ToolsUsage xmlns:t="urn:crystal-reports:schemas:report-detail" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1</ToolsUsage> 

到目前爲止,一切都很好(級別屬性等於「1」爲第一組節點)。但我無法進一步發展。 就好了,我試圖讓現場節點的值內文本(第一部分occurence的):

<xsl:value-of select="t:Group[1]/GroupHeader/Section[1]/Field/Value"/> 

但我不是(作爲結果節點)得到任何東西。我試圖得到一個SectionNumber屬性,也沒有結果。我甚至使用xml路徑工具來提取精確的xpath查詢,但似乎查詢是正確的。我相信這是非常基本的東西,但沒有找到什麼。

回答

2

鑑於<CrystalReport xmlns="urn:crystal-reports:schemas:report-detail">...</CrystalReport>,所有後代元素也在命名空間中,因此您的路徑需要在所有元素上使用前綴,例如t:Group[1]/t:GroupHeader/t:Section[1]/t:Field/t:Value

+0

真的那麼容易,謝謝! –