我是XML / XSLT的初学者,我很难让XSLT样式表将XML转换为另一种XML。
这是我的XML文件:
<Book
xmlns:qws="http://www.w3schools.com">
<Price>168</Price>
<Author>
<Fnamn>Richard</Fnamn>
<Mnamn>Eric</Mnamn>
<Snamn>Meyer</Snamn>
</Author>
<Title>Multimedia Learning</Title>
</Book>
我想将该XML转换为以下
<Firstname>Richard></Firstname>
<MiddleName>Eric></Middlename>
<Lastname>Meyer</Lastname>
这是我尝试使用XSL的失败
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="hej"
xmlns:qws="http://www.w3schools.com"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/qws:Book">
<h>Information</h>
<xsl:apply-templates select="qws:Author"/>
</xsl:template>
<xsl:template match="qws:Author">
<Firstname><xsl:value-of select="qws:Fnamn"/></Firstname>
<MiddleName><xsl:value-of select="qws:Mnamn"/></MiddleName>
<Lastname><xsl:value-of select ="qws:Snamn"/></Lastname>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
您的xpath不正确。有很多方法可以做到这一点。这是转换xml的示例xslt。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Information</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">First Name</th>
<th style="text-align:left">Middle Name</th>
<th style="text-align:left">Last Name</th>
</tr>
<xsl:for-each select="Book/Author">
<tr>
<td>
<xsl:value-of select="Fnamn"/>
</td>
<td>
<xsl:value-of select="Mnamn"/>
</td>
<td>
<xsl:value-of select="Snamn"/>
</td>
</tr>
<tr>
<td colspan="3">
Price : <xsl:value-of select="../../Book/Price"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
已更新,可根据要求生成重新格式化的xml。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Book>
<xsl:for-each select="Book/Author">
<Author>
<FirstName><xsl:value-of select="Fnamn"/>
</FirstName>
<MiddleName>
<xsl:value-of select="Mnamn"/>
</MiddleName>
<LastName>
<xsl:value-of select="Snamn"/>
</LastName>
</Author>
</xsl:for-each>
</Book>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
两件事:您尝试过的脚本不会生成根元素,使其成为格式不正确的xml。此外,您不需要使用前缀,因为目标节点不在绑定到前缀的名称空间中。现在,如果您要重新使用原始图书,请考虑使用local-name()
或name()
作为已定义的<xsl:element>
名称:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:qws="http://www.w3schools.com"
exclude-result-prefixes="qws msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Book">
<xsl:element name="{local-name()}">
<h>Information</h>
<xsl:apply-templates select="Author"/>
</xsl:element>
</xsl:template>
<xsl:template match="Author">
<Firstname><xsl:value-of select="Fnamn"/></Firstname>
<MiddleName><xsl:value-of select="Mnamn"/></MiddleName>
<Lastname><xsl:value-of select ="Snamn"/></Lastname>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<Book>
<h>Information</h>
<Firstname>Richard</Firstname>
<MiddleName>Eric</MiddleName>
<Lastname>Meyer</Lastname>
</Book>
答案 2 :(得分:0)
您尝试失败的原因是:
虽然您的输入XML包含名称空间声明xmlns:qws="http://www.w3schools.com"
,但此声明不会在任何地方使用,而且完全是冗余的。输入XML中的所有元素都不在命名空间中,并且您尝试使用绑定到"http://www.w3schools.com'
命名空间的前缀来解决它们会因此而失败。
您需要做的就是从qws:
和match
表达式中删除select
前缀,它会起作用。
好吧,几乎所有:你还应该删除不需要的命名空间声明:
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
和xmlns:qws="http://www.w3schools.com"
以及exclude-result-prefixes="hej"
部分(您甚至没有使用hej
前缀声明名称空间)。