2011-08-11 58 views
1

我有這樣如何在一個select語句

<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" location="file:/dev/null" iosp="lasp.tss.iosp.ValueGeneratorIOSP" start="0" increment="1"> 
    <attribute name="title" value="Vector time series"/> 
    <dimension name="time" length="100"/> 
    <variable name="time" shape="time" type="double"> 
     <attribute name="units" type="String" value="seconds since 1970-01-01T00:00"/> 
    </variable> 
    <group name="Vector" tsdsType="Structure" shape="time"> 
     <variable name="x" shape="time" type="double"/> 
     <variable name="y" shape="time" type="double"/> 
     <variable name="z" shape="time" type="double"/> 
    </group> 
</netcdf> 

一個XML文件中選擇兩個節點,我想他的名字是可變或組節點的值,所以什麼是應該做的正確的語法像?

<xsl:value-of select="/netcdf/variable or /netcdf/group"/> 

在此先感謝

回答

1

使用空間(namespace前綴x聲明):

"/x:netcdf/*[self::x:variable or self::x:group]" 

請注意,XSLT 1.0 xsl:value-of總是返回發現第一元素的文本值。使用更好的xsl:copy-of來顯示所有返回的元素。

+1

請參閱@empo,只有在XSLT 1.0中,您的最後陳述纔是真實的。 –

+0

是的,正確的。我太習慣回答XSLT 1.0的問題,我忘了指定它。 –

1

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:d="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/*/*[self::d:variable or self::d:group]"/> 
</xsl:template> 

</xsl:stylesheet> 

時所提供的XML文檔應用:

<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" 
location="file:/dev/null" iosp="lasp.tss.iosp.ValueGeneratorIOSP" 
start="0" increment="1"> 
    <attribute name="title" value="Vector time series"/> 
    <dimension name="time" length="100"/> 
    <variable name="time" shape="time" type="double"> 
     <attribute name="units" type="String" 
        value="seconds since 1970-01-01T00:00"/> 
    </variable> 
    <group name="Vector" tsdsType="Structure" shape="time"> 
     <variable name="x" shape="time" type="double"/> 
     <variable name="y" shape="time" type="double"/> 
     <variable name="z" shape="time" type="double"/> 
    </group> 
</netcdf> 

產生(我猜是)想要的結果

<variable xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" name="time" shape="time" type="double"> 
    <attribute name="units" type="String" value="seconds since 1970-01-01T00:00"/> 
</variable> 
<group xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" name="Vector" tsdsType="Structure" shape="time"> 
    <variable name="x" shape="time" type="double"/> 
    <variable name="y" shape="time" type="double"/> 
    <variable name="z" shape="time" type="double"/> 
</group> 

做筆記<xsl:value-of>輸出字符串值,而<xsl:copy-of>輸出節點(s)。在你的情況下,任何一個元素的字符串值只在空白處爲空,所以你可能需要這些元素本身。

這確實是一個XPath問題並有不同的可能的解決方案:

/*/*[self::d:variable or self::d:group] 

(上面是在上面的轉化中使用的),或:

/*/d:variable | /*d:group 

這一個用途XPath 工會運營商/