簡體   English   中英

XSLT使用Apply模板檢查節點是否存在

[英]XSLT use apply template to check if node exists

我正在嘗試檢查節點是否存在,然后是否執行計算並存儲值

因為我要列出營業時間

<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>

<xsd:apply-template select='{the XPath}'將僅選擇在其當前上下文中符合select的相對XPath的那些元素。 在內部建立此列表后,它將“應用模板”。

在你的例子中

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

將選擇所有父級為“ OpeningHours”的元素“ Monday”,然后再次應用規則。 您的下一個“最具體的匹配”是

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

(盡管將其寫為<xsl:template match="OpeningHours/*">

因此,對於每個選定的元素(從apply-templates中),都會調用template-match。 如果您有節點,則無需在那里進行測試。

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說: 選擇所有名為“星期一”的子元素,但前提是它們具有名為“ OpeningHours”的父元素

希望這可以幫助,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM