XSLT使用应用模板来检查节点是否存在

时间:2013-11-24 11:48:59

标签: xml xslt xslt-2.0

我正在尝试检查节点是否存在,然后它是否执行计算并存储值

因为我想列出营业时间

<xsl:variable name="Monday">
    <xsl:apply-templates select="OpeningHours/Monday"/>
</xsl:variable>

<xsl:template match="OpeningHours/node()">
    <xsl:if test="current()">
        <xsl:value-of select="Open + Close"/>
    </xsl:if>
</xsl:template>

虽然看起来我在某处做错了什么

我的xml是

<OpeningHours>
    <Monday>
        <Open>8.5</Open>
        <Close>20</Close>
    </Monday>
    <Tuesday>
        <Open>8.5</Open>
        <Close>20</Close>
    </Tuesday>
    <Wednesday>
        <Open>8.5</Open>
        <Close>20</Close>
    </Wednesday>
    <Friday>
        <Open>8.5</Open>
        <Close>22</Close>
    </Friday>
    <Saturday>
        <Open>7</Open>
        <Close>14</Close>
    </Saturday>
</OpeningHours>

1 个答案:

答案 0 :(得分:0)

<xsd:apply-template select='{the XPath}'将仅选择那些符合当前上下文中select的相对XPath的元素。在内部构建此列表后,它将“apply-templates”。

在你的例子中

<xsl:variable name="Monday">
    <xsl:apply-templates select="OpeningHours/Monday"/>
</xsl:variable>

将选择所有名为“Monday”且具有父“OpeningHours”的元素,然后再次应用规则。

,你的下一个“最具体的匹配”将是

<xsl:template match="OpeningHours/node()">

(尽管将其写为<xsl:template match="OpeningHours/*">

更为常见

因此,对于每个选定的元素(来自apply-templates),将调用模板匹配。如果您有一个节点,则无需在那里进行测试。

PS;我会尝试以下XSLT

<xsl:variable name="Monday">
    <xsl:apply-templates select="OpeningHours/Monday"/>
</xsl:variable>

<xsl:template match="OpeningHours/*">
    <xsl:value-of select="Open"/>
    <xsl:text>-</xsl:text>
    <xsl:value-of select="Close"/>
</xsl:template>

如果您确实希望测试节点的存在,则通常使用XPath的“谓词”轴。例如;

<apply-templates select="Monday[parent::OpeningHours]" />

这个例子XPath说;选择名为“Monday”的所有子元素,但前提是它们具有名为“OpeningHours”的父元素

希望这有帮助,