为什么这个XSLT样式表不能按照我想要的方式工作?

时间:2016-01-09 01:17:55

标签: xml xslt

我是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>

3 个答案:

答案 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>

enter image description here

已更新,可根据要求生成重新格式化的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>

enter image description here

答案 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前缀声明名称空间)。