我有一个
的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>
我遇到的问题是我需要人和狗块之间的位置块。我试过../但它不起作用。我主要简化了这一点,但重点是。我似乎无法记住我需要放置在位置前面以使其工作。感谢。
答案 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>