如何在一个select语句中选择两个节点

时间:2011-08-11 07:52:45

标签: xslt netcdf ncml

我有一个像这样的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>

我想知道名称是变量或组的节点的值,那么做什么的正确语法是什么?

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

提前致谢

2 个答案:

答案 0 :(得分:1)

使用(使用前缀x声明的名称空间):

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

请注意,XSLT 1.0 xsl:value-of将始终返回找到的第一个元素的文本值。使用更好的xsl:copy-of来显示所有返回的元素。

答案 1 :(得分: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>输出节点。在您的情况下,任一元素的字符串值仅在空白区域为空,因此您可能希望元素本身。

这实际上是一个XPath问题,并且有不同的可能解决方案:

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

(以上用于上述转换),或:

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

这个使用XPath union 运算符 /