XSL父子问题

时间:2008-11-05 16:35:58

标签: xml xslt

我有一个

的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 个答案:

答案 0 :(得分:1)

我在您的示例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

答案 1 :(得分:1)

首先,您的XML仍然格式不正确,实际上我无法理解您为什么循环<date/>标记 - <date/>内只有一个<subscriber/>标记(假设第一个<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>

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在这种情况下,将应用模板调用移到for-each循环之外是不是更合乎逻辑?由于人员,地点和狗元素是订户的子女,因此应在订户范围内处理,而不是在日期范围内处理。

即:

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