2013-11-24 2 views
0

я пытаюсь проверить, если узел существует, то, если он выполняет вычисления и сохранения значенияиспользование XSLT применить шаблон, чтобы проверить, если узел существует

, поскольку я пытаюсь перечислить часы работы

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

Что делает ваш XML выглядеть? Каков ожидаемый и фактический результат? – nwellnhof

+1

Ваш select = '..' уже выбирает «существующие» узлы. «Xsl: if» кажется излишним. –

+0

@MarvinSmit, так что вы имеете в виду, что он проверяет, существует ли он? – Enzero

ответ

0

В поле <xsd:apply-template select='{the XPath}' будут выбраны только те элементы, которые соответствуют относительному XPath выбора в его текущем контексте. После создания этого списка внутренне он будет «применять шаблоны».

В вашем примере

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

будет выбрать все элементы, называемые «Понедельник», которые имеют родительские «OpeningHours», а затем применить правила снова. Следующий «наиболее специфичный матч» будет одним из

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

(Хотя его чаще писать его как <xsl:template match="OpeningHours/*">

Таким образом, для каждого выбранного элемента (от применяемых-шаблонов) шаблон матча называется . нет необходимости, чтобы проверить там, если вы «есть узел»

пс;. Я хотел бы попробовать следующий 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

Надеется, что это помогает,

Смежные вопросы