XSL родитель дочерняя проблема - PullRequest
0 голосов
/ 05 ноября 2008

У меня xml сборка

<elig>
 <subscriber code="1234"/>
    <date to="12/30/2004"
        from="12/31/2004"/>
       <person name="bob"
           ID="654321"/>
       <dog type="labrador"
            color="white"/>
    <location name="hawaii"
              islandCode="01"/>
 </subscriber>
</elig>

В XSL у меня есть:

<xsl:template match="subscriber">
 <xsl:for-each select="date">
  <xsl:apply-templates match="person" />
  <xsl:apply-templates match="location" />
  <xsl:apply-templates match="dog" />
 </xsl:for-each>
</xsl:template>

У меня проблема в том, что мне нужен блок местоположения между человеком и собакой. Я пытался ../ и это не работает. Я упростил это в основном, но дело дошло. Кажется, я не могу вспомнить, что мне нужно разместить перед местом, чтобы заставить его работать. Спасибо.

Ответы [ 4 ]

1 голос
/ 18 сентября 2009
<xsl:template match="subscriber">
  <xsl:apply-templates match="date" />
</xsl:template>

<xsl:template match="date">
  <xsl:apply-templates match="../person" />
  <xsl:apply-templates match="../location" />
  <xsl:apply-templates match="../dog" />
</xsl:template>

      instead of xsl:for-each on date better practice is having a template match for date.
1 голос
/ 05 ноября 2008

Прежде всего, ваш XML все еще не правильно сформирован, и я на самом деле не могу понять, почему вы перебираете теги <date/> - внутри <subscriber/> есть только один тег <date/> (при условии, что первый <subscriber/> не должен быть самозакрытым).

При использовании XPath вы всегда должны думать о контексте, в котором вызывается XPatch. Следующее должно сделать это (когда мое предположение о вашей структуре данных верно):

<xsl:template match="subscriber">
 <xsl:for-each select="date"> 
  <!-- from here on we're in the context of the date-tag -->
  <xsl:apply-templates match="../person" />
  <xsl:apply-templates match="../location" />
  <xsl:apply-templates match="../dog" />
 </xsl:for-each>
</xsl:template>
1 голос
/ 05 ноября 2008

Я изменил одну опечатку в вашем примере XML:

<elig>
 <subscriber code="1234">
    <date to="12/30/2004" from="12/31/2004"/>
       <person name="bob" ID="654321"/>
       <dog type="labrador" color="white"/>
    <location name="hawaii" islandCode="01"/>
 </subscriber>
</elig>

И с помощью этой таблицы стилей все работает просто отлично:

<xsl:template match="subscriber">
 <xsl:for-each select="date">
  <xsl:apply-templates select="../person" />
  <xsl:apply-templates select="../location" />
  <xsl:apply-templates select="../dog" />
 </xsl:for-each>
</xsl:template>

<xsl:template match="person">person</xsl:template>
<xsl:template match="location">location</xsl:template>
<xsl:template match="dog">dog</xsl:template>

Вывод:

personlocationdog
0 голосов
/ 10 августа 2009

В этом случае, не логичнее ли переместить вызовы apply-template вне цикла for-each? Так как элементы person, location и dog являются дочерними для подписчика, они должны обрабатываться в рамках подписчика, а не в рамках даты.

т.е:.

<xsl:template match="subscriber">
  <xsl:for-each select="date">
     <!-- Perform the processing of the date tags here-->
  </xsl:for-each>

  <xsl:apply-templates match="person" />
  <xsl:apply-templates match="location" />
  <xsl:apply-templates match="dog" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...