Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个XSLT样式表不能按我希望的方式处理这个XML?_Xml_Xslt - Fatal编程技术网

为什么这个XSLT样式表不能按我希望的方式处理这个XML?

为什么这个XSLT样式表不能按我希望的方式处理这个XML?,xml,xslt,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>Me

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

您的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。另外,您不需要使用前缀,因为目标节点不在绑定到前缀的命名空间中。现在,如果您想重新使用原始图书,请考虑使用本地名称或名称作为定义的名称:

输出


尝试失败的原因如下:

尽管您的输入XML包含一个名称空间声明xmlns:qws=http://www.w3schools.com,此声明不在任何地方使用,完全是多余的。输入XML中的任何元素都不在命名空间中,您尝试使用绑定到http://www.w3schools.com'命名空间因此失败

您所需要做的就是从匹配中删除qws:前缀,然后选择表达式,它就可以工作了

几乎所有:您还应该删除不需要的名称空间声明:
xmlns:msxsl=urn:schemas microsoft com:xslt和xmlns:qws=http://www.w3schools.com,以及exclude result prefixes=hej部分。您甚至还没有使用hej前缀声明名称空间。

谢谢。xpath是什么意思?为什么样式表中包含Price?xpath是xslt中使用的查询语言。例如,当我使用Book/Author时,它被指向元素。当指针指向Author元素时,可以调用query来获取元素值,依此类推。当指针处于级别时,如果需要检索元素的值,则必须使指针向上跳两级。这就是为什么我在Book/Price.Downvoting前面使用了.././这个答案,因为尽管它提供了问题的有效解决方案a,但它并不能解释OP尝试失败的原因,b在这里使用每个选项而不是应用模板不是特别好的形式,尤其是在教初学者的时候。这很有效,我现在对逻辑理解得更好了。谢谢。您不需要为引用的节点加上qws前缀,因为它已经是xml中声明的名称空间。这不是正确的理由。真正的原因是目标节点不在绑定到前缀的命名空间中。谢谢,我相应地调整了文本。我希望各位专家能够回答有关Python/PHP/R/Java/VBA线程的XSLT问题。许多程序员都在运行嵌套循环来转换/重写XML文件,几乎不知道这种好的、有用的语言!这确实奏效了。感谢这里所有的回答。我现在对XSLT的逻辑有了更好的理解。有些事情真的很奇怪。我尝试根据您的建议调整XSL,但输出是整个文档,而不是指定的templateAuthor。不过,我已经解决了这个问题。这是一个愚蠢的问题,我太愚蠢了,无法立即看到。但现在的问题是,我在InternetExplorer上得到的唯一输出是信息头,而不是Fname、Mname和Sname的值。我是不是遗漏了什么?@Rengaw我不确定我是否理解你所描述的。不过,请记住,浏览器设计用于显示HTML,而不是测试XSL转换。如果您的目的是在浏览器中显示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>
<?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>