递归变量

时间:2012-04-19 09:58:58

标签: xslt

第一个XML

<?xml version="1.0"?>
<response>
<status>
<code>0</code>
</status>
<newsList>
<news>

<id>1</id>
<title>some</title>
<date>30.11.2011T00:00.00</date>
<shortText>some short text</shortText>
<important>LOW</important>

</news>

第二个XML

<?xml version="1.0"?>
<response>
<status>
<code>0</code>
</status>
<newsList>
<news>

<id>1</id>
<text>
Some text here
</text>
</news>

结果应该是来自第一个XML的标题日期和短文本以及来自第二个XML的文本。

到目前为止我在XSLT下面了。

                  

<xsl:template match="response">
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th align="left">Title</th>
      <th align="left">shortText</th>
      <th align="left">date</th>
      <th align="left">text</th>
    </tr>
    <xsl:for-each select="newsList/news">   
    <tr>
     <td><xsl:value-of select="title" /></td>
      <td><xsl:value-of select="shortText" /></td>
      <td><xsl:value-of select="date" /></td>
      <td><xsl:value-of select="document('news-details.xml')//news[id=$id_news]/text"/>
     </td>
    </tr>
    </xsl:for-each>
  </table>
</xsl:template>
</xsl:stylesheet>

但这将始终显示新闻编号1中的文字。

我知道不可能更新vululue但是如何才能完成它?

2 个答案:

答案 0 :(得分:1)

以下是使用密钥的示例:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="html" version="5.0"/>

  <xsl:param name="url2" select="'news-details.xml'"/>
  <xsl:variable name="doc2" select="document($url2, /)"/>

  <xsl:key name="k1" match="news" use="id"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>Example</title>
      </head>
      <body>
        <table>
          <thead>
            <tr>
              <th>Title</th>
              <th>short text</th>
              <th>date</th>
              <th>text</th>
            </tr>
          </thead>
          <tbody>
            <xsl:apply-templates select="//news"/>
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="news">
    <xsl:variable name="id" select="id"/>
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="shortText"/></td>
      <td><xsl:value-of select="date"/></td>
      <td>
        <xsl:for-each select="$doc2">
          <xsl:value-of select="key('k1', $id)/text"/>
        </xsl:for-each>
      </td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

  <xsl:template match="response">
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th align="left">Title</th>
        <th align="left">shortText</th>
        <th align="left">date</th>
        <th align="left">text</th>
      </tr>
      <xsl:apply-templates select="newsList/news"/>
    </table>
  </xsl:template>

  <xsl:template match="newsList/news">
    <xsl:variable name="id_news" select="ID"/>
    <tr>
      <td><xsl:value-of select="title" /></td>
      <td><xsl:value-of select="shortText" /></td>
      <td><xsl:value-of select="date" /></td>
      <td>
        <xsl:apply-templates select="document('news-details.xml')//news[id=$id_news]/text"/>
      </td>
    </tr>
  </xsl:template>

  <xsl:template match="text">
    <xsl:value-of select="."/>
  </xsl:template>