学习XSLT,我想知道这种转换是否可行
输入类似这样的内容
<book>
<title>Title 1</title>
<author>Author 1</author>
</book>
<book>
<title>Title 2</title>
<author>Author 2</author>
</book>
<book>
<title>Title 3</title>
<author>Author 3</author>
</book>
输出
<book1>
<title1>Title 1</title1>
<author1>Author 1</author1>
</book1>
<book2>
<title2>Title 2</title2>
<author2>Author 2</author2>
</book2>
<book3>
<title3>Title 3</title3>
<author3>Author 3</author3>
</book3>
这个XSLT会是什么样的?
答案 0 :(得分:1)
正如评论中所述,这很容易,但不明智。但是,如果你承认这是不明智的,那么没有理由说明如何。
首先,在XSLT中,有两种创建元素的方法,方法是放置element inline:
<xsl:template match="book">
<book1>
<!-- Some stuff -->
</book1>
<xsl:template>
或以编程方式使用xsl:element
指令:
<xsl:template match="book">
<xsl:element name="book1">
<!-- Some stuff -->
</xsl:element>
<xsl:template>
如果我们使用attribute value template,上面代码中的@name
属性可以采用XPath表达式。这意味着我们可以在其中插入动态值:
<xsl:template match="book">
<xsl:element name="book{//some/xpath/here()}">
<!-- Some stuff -->
</xsl:element>
<xsl:template>
此外,我们可以使用position() Xpath函数根据当前上下文获取当前节点的位置:
<xsl:template match="/">
<xsl:for-each select="//book">
<!-- this loop will number the books in the whole document
because its seaching in all nodes (//). -->
<xsl:value-of select="position()"/>
</xsl:for-each>
<xsl:template>
<xsl:template match="library">
<xsl:for-each select=".//book">
<!-- this loop will number the books in the current *library*
because its seaching in all nodes under the library node (.//) -->
<xsl:value-of select="position()"/>
</xsl:for-each>
<xsl:template>
正如Michael Kay在他的回答中所显示的那样( grrr ),将这些结合起来是微不足道的。
答案 1 :(得分:0)
我不知道你为什么要创建这样一个可怕的XML文档,但如果必须,你可以使用:
<xsl:template match="book">
<xsl:variable name="n" select="position()"/>
<xsl:element name="book{$n}">
<xsl:element name="title{$n}">
<xsl:value-of select="title"/>
</xsl:element>
<xsl:element name="author{$n}">
<xsl:value-of select="author"/>
</xsl:element>
</xsl:element>
</xsl:template>