我是XSLT的新手,我正在寻求帮助。我需要将简单的XML文件转换为另一个XML。 这是第一个:
<?xml version="1.0" encoding="utf-8"?>
<library xmlns="http://example.net/library/1.0">
<authors>
<author id="a1">
<name>John</name>
<surname>Applesed</surname>
<born>1979-11-11</born>
</author>
<author id="a2">
<name>Krzysztof</name>
<surname>Habdank</surname>
<born>1965-12-12</born>
</author>
<author id="a3">
<name>Paulo</name>
<surname>Coelho</surname>
<born>1915-06-17</born>
</author>
<author id="a4">
<name>Mikołaj</name>
<surname>Kopernik</surname>
<born>1473-02-19</born>
<died>1543-05-24</died>
</author>
</authors>
<books>
<book id="b1" author-id="a1">
<title>Missing opportunity</title>
<published>1992</published>
<isbn>978-3-16-148410-0</isbn>
</book>
<book id="b2" author-id="a4">
<title>O obrotach sfer niebieskich</title>
<published>1543</published>
</book>
</books>
</library>
这是我想要的格式:
<?xml version="1.0" encoding="utf-8"?>
<books xmlns="http://example.net/books/1.0" xmlns:a="http://example.net/author/1.0">
<book>
<a:author>
<a:name>John</a:name>
<a:surname>Applesed</a:surname>
</a:author>
<title>Missing opportunity</title>
</book>
<book>
<a:author>
<a:name>Mikołaj</a:name>
<a:surname>Kopernik</a:surname>
</a:author>
<title>O obrotach sfer niebieskich</title>
</book>
</books>
以下是我设法编码的内容:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<books xmlns="http://example.net/books/1.0" xmlns:a="http://example.net/author/1.0">
<xsl:for-each select="library/authors/author[@id='id']">
<book>
<name><xsl:value-of select="@name"/></name>
<surname><xsl:value-of select="@surname"/></surname>
</book>
</xsl:for-each>
</books>
</xsl:template>
</xsl:stylesheet>
不幸的是,我得到的只是:
<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://example.net/books/1.0" xmlns:a="http://example.net/author/1.0" />
我的知识来源: https://msdn.microsoft.com/en-us/library/ms766462(v=vs.85).aspx
我正在检查这个网站的效果:
http://www.freeformatter.com/xsl-transformer.html#ad-output
感谢您的时间和精力。
答案 0 :(得分:0)
产生所需输出的样式表如下所示:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:l="http://example.net/library/1.0"
xmlns:a="http://example.net/author/1.0"
xmlns="http://example.net/books/1.0"
exclude-result-prefixes="l"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/l:library">
<xsl:apply-templates select="l:books" />
</xsl:template>
<xsl:template match="l:books">
<books>
<xsl:apply-templates select="l:book" />
</books>
</xsl:template>
<xsl:template match="l:book">
<xsl:variable name="author" select="//l:author[@id = current()/@author-id]" />
<book>
<a:author>
<a:name><xsl:value-of select="$author/l:name" /></a:name>
<a:surname><xsl:value-of select="$author/l:surname" /></a:surname>
</a:author>
<title><xsl:value-of select="l:title" /></title>
</book>
</xsl:template>
</xsl:stylesheet>
注意:
<xsl:stylesheet>
声明。http://example.net/books/1.0
),可以通过未注册前缀的事实来识别。样式表中的每个未加前缀的元素都将位于此命名空间中。l
,为作者名称空间选择a
,但您可以使用任何您喜欢的前缀。exclude-result-prefixes
$authors
变量所示。current()
函数允许您将XPath表达式内部引用到XSLT处理器当前正在处理的节点。l
。<xsl:template>
/<xsl:apply-templates>
when writing stylesheets。