XSLT:在嵌套的XML结构中使用xsl:key

时间:2016-08-31 08:03:44

标签: xslt

示例

以下是MSDN的一个示例。它展示了如何使用xsl:key将XML文件转换为HTML。

示例XML(输入)

<books>
  <book title="XML Today" author="David Perry" release="2016"/>
  <book title="XML and Microsoft" author="David Perry" release="2015"/>
  <book title="XML Productivity" author="Jim Kim" release="2015"/>
</books>

示例XSL(输入)

<xsl:key name="title-search" match="book" use="@author"/>

<xsl:template match="/">
   <HTML>
      <BODY>
        <xsl:for-each select="key('title-search', 'David Perry')">
         <DIV>
         <xsl:value-of select="@title"/>
         </DIV>
      </xsl:for-each>
      </BODY>
   </HTML>
</xsl:template>

示例HTML(输出)

<HTML>
  <BODY>
    <DIV>XML Today</DIV>
    <DIV>XML and Microsoft</DIV>
  </BODY>
</HTML>

我的问题

我想生成相同的HTML输出,但使用不同的XML输入。相应的XSL文件应该如何?

我的XML(输入)

<books>
  <book>
    <a n="author"><s>David Perry</s></a>
    <a n="title"><s>XML Today</s></a>
    <a n="release"><i>2016</i></a>
  </book>
  <book>
    <a n="author"><s>David Perry</s></a>
    <a n="title"><s>XML and Microsoft</s></a>
    <a n="release"><i>2015</i></a>
  </book>
  <book>
    <a n="author"><s>Jim Kim</s></a>
    <a n="title"><s>XML Productivity</s></a>
    <a n="release"><i>2015</i></a>
  </book>
</books>

我的XSL(输入)

???

我的HTML(输出)

<HTML>
  <BODY>
    <DIV>XML Today</DIV>
    <DIV>XML and Microsoft</DIV>
  </BODY>
</HTML>

2 个答案:

答案 0 :(得分:1)

在第一个示例中,您的密钥与book属性匹配author元素,但在新XML中,您希望通过a元素匹配它们{{1}属性是&#34; author&#34;,所以键看起来像这样。

n

然后,要获得匹配的<xsl:key name="title-search" match="book" use="a[@n='author']/s"/> 的标题,您可以执行此操作...

book

因此,您的XSLT将如下所示:

<xsl:value-of select="a[@n='title']/s"/>

如果<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" /> <xsl:key name="title-search" match="book" use="a[@n='author']/s"/> <xsl:template match="/"> <HTML> <BODY> <xsl:for-each select="key('title-search', 'David Perry')"> <DIV> <xsl:value-of select="a[@n='title']/s"/> </DIV> </xsl:for-each> </BODY> </HTML> </xsl:template> </xsl:stylesheet> 元素只是每个/s元素下的唯一元素,那么您实际上可以将s放在此处的表达式中。

这也可行:

a

答案 1 :(得分:0)

这是基本的XSLT转换,您可以这样做:

<xsl:template match="book"> 
  <div> 
  Author: <xsl:value-of select="a[@n='author']/s" />
  title: <xsl:value-of select="a[@n='title']/s" >
  release: <xsl:value-of select="a[@n='release']/s" >
  </div>
</xsl:template>