XSL - 为每个循环组合跟随兄弟

时间:2015-12-14 07:58:19

标签: xml xslt for-loop

早上好!我只有一个小问题。我有一个XML结构,这是一个例子

<?xml version="1.0" encoding="UTF-8"?>
<div type="letter">
        <head>
          <persName type="creator">
            <forename>Theo</forename>
            <surname>Barnes</surname>
          </persName>
          <persName type="addressee">
            <forename>Alex</forename>
            <surname>Rollett</surname>
          </persName>
        </head>
        <opener>
          <dateline>
            <date when="2015-01">2015-01</date>
            <placeName key="Graz">Graz</placeName>
          </dateline>
          <salute>Hello everybody</salute>
        </opener> 
</div>

这是我的XSL样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

<xsl:template match="/">
        <div>
          <head>
                 <xsl:for-each select="//persName[@type='creator']">
                 <xsl:text> From </xsl:text>
                        <xsl:value-of select="forename"/>
                        <xsl:text> to </xsl:text>
                        <xsl:value-of select="following-sibling::persName[1]/forename"/>
                    <xsl:if test="position() != last()">
                    </xsl:if>
                    <xsl:text> at  </xsl:text>
                    <!--  her is the error, i think but why-->
                    <xsl:value-of select="dateline[1]/date"/>   
                 </xsl:for-each>
           </head>
        </div>
    </xsl:template>
</xsl:stylesheet>

我有问题,我无法添加日期行或placeName的值无关紧要。 Id也应该在循环中工作,因为原因是这只是文档的一小部分。所以我的问题是我的错误在哪里。我在代码中提出了问题点。 目前输出是:

From Theo to Alex at 

我期待或者更好的是我正在寻找以下输出:

From Theo to Alex at 2015-01 location Graz

一切顺利,并尽快给您朗读。 欢呼声

2 个答案:

答案 0 :(得分:0)

的确,你找到了错误的地方。问题是<xsl:value-of select=""/>指令正确地检索了所需的数据,因为它是在<persName>节点上的每个上下文。

通过这样的修复,您将得到您想要的东西:

<xsl:value-of select="../../opener/dateline[1]/date"/>

和类似的位置信息:

<xsl:value-of select="../../opener/dateline[1]/placeName"/>

答案 1 :(得分:0)

以下部分中的上下文元素为persName,因为它位于foreach循环中,您可以循环遍历persName

<xsl:value-of select="dateline[1]/date"/>

这是一个可能的XPath表达式,用于从上下文date获取目标persName元素:

<xsl:value-of select="following::opener/dateline[1]/date"/>