我已将问题编辑清楚了。 我想获取包含节节点和标题节点的所有节节点,保持嵌套级别.Below是我想要的输出结果:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<section id="intro" difficulty="easy">
<title>Introduction</title>
<section>
<title>Web Data and the Two Cultures</title>
</section>
</section>
<section id="syntax" difficulty="medium">
<title>A Syntax For Data</title>
<section>
<title>Base Types</title>
</section>
<section>
<title>Representing Relational Databases</title>
</section>
<section>
<title>Representing Object Databases</title>
</section>
</section>
</results>
像这样的xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
<book>
<title>Data on the Web</title>
<author>Serge Abiteboul</author>
<author>Peter Buneman</author>
<author>Dan Suciu</author>
<section id="intro" difficulty="easy">
<title>Introduction</title>
<p>Text ... </p>
<section>
<title>Web Data and the Two Cultures</title>
<p>Text ... </p>
<figure height="400" width="400">
<title>Traditional client/server architecture</title>
<image source="csarch.gif"/>
</figure>
<p>Text ... </p>
</section>
</section>
<section id="syntax" difficulty="medium">
<title>A Syntax For Data</title>
<p>Text ... </p>
<figure height="200" width="500">
<title>Graph representations of structures</title>
<image source="graphs.gif"/>
</figure>
<p>Text ... </p>
<section>
<title>Base Types</title>
<p>Text ... </p>
</section>
<section>
<title>Representing Relational Databases</title>
<p>Text ... </p>
<figure height="250" width="400">
<title>Examples of Relations</title>
<image source="relations.gif"/>
</figure>
</section>
<section>
<title>Representing Object Databases</title>
<p>Text ... </p>
</section>
</section>
</book>
这是我的解决方案,这是错误的:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/book">
<xsl:apply-templates select="section"/>
</xsl:template>
<xsl:template match="section">
<xsl:element name="section">
<xsl:for-each select="@*">
<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
</xsl:for-each>
</xsl:element>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="section"/>
</xsl:template>
<xsl:template match="title">
<xsl:element name="title">
<xsl:for-each select="@*">
<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
</xsl:for-each>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我正在考虑使用递归,但我没有在XSLT中找到如何做到这一点。 应该有其他方式。 提前谢谢!
答案 0 :(得分:0)
如果您确实想要做的是将book
元素重命名为results
,则需要从XSLT identity template开始
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
就其本身而言,它按原样复制源文档中的所有节点,这意味着您只需要为要更改的节点编写模板。在这种情况下,您正在更改book
元素,因此您将拥有一个特定的模板,如下所示:
<xsl:template match="book">
<results>
<xsl:apply-templates select="@*|node()"/>
</results>
</xsl:template>
另外,如果您要删除section
和title
(以及book
)之外的元素,一种方法是使模板与其他&#39;相匹配;元素,只是忽略它们
<xsl:template match="*[not(self::book) and not(self::section) and not(self::title)]" />
那就是它!试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="book">
<results>
<xsl:apply-templates select="@*|node()"/>
</results>
</xsl:template>
<xsl:template match="*[not(self::book) and not(self::section) and not(self::title)]" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请记住,如果您使用<?xml-stylesheet
在客户端上进行转换,浏览器可能只显示文本而不是XML,因为它确实希望输出为HTML。您可以通过查看(页面)源来查看实际结果。