来自父节点的数据(尝试过的)

时间:2015-12-14 21:13:56

标签: xml xslt xpath

我正在使用基于w3schools.com上的书店示例的一些XML。我希望的最终结果是书店,书籍和标题列表 - 真正的用途是解析一些生产XML数据,将插件数据插入到具有大量不同来源的数据库表中 - 即减少a基本字段集到最小公分母。

var button = document.getElementById('filePick');
button.onclick(function() {
    filepicker.pickAndStore({
        //etc.
    });
});

上面带有“祖先”的行是基于另一个帖子中的建议。我尝试了各种选项,包括“../Bookstore@StoreNamesttribute”,“../ Bookstore / Storename”...... / Storename“等等。它们都会出错”错误转换XML XSLT编译错误。第12行的'xsl:value-of'开始标记与'xsl:for-each'的结束标记不匹配。第14行,第4位。“

如果删除该行,我会

    <?xml version="1.0" encoding="utf-8"?>
    <Bookstores>
      <Bookstore Storenameattribute="Barnes and Noble Attribute">
        <Storename>Barnes and Noble</Storename>
        <book category="WEB">
          <title lang="en">Learning XML</title>
          <author>Erik T. Ray</author>
          <year>2003</year>
          <price>39.95</price>
        </book>
        <book category="WEB">
          <title lang="en">XQuery Kick Start</title>
          <author>James McGovern</author>
          <author>Per Bothner</author>
          <author>Kurt Cagle</author>
          <author>James Linn</author>
          <author>Vaidyanathan Nagarajan</author>
          <year>2003</year>
          <price>49.99</price>
        </book>
      <Bookstore Storenameattribute="Amazon Attribute">
        <Storename>Amazon</Storename>
        <book category="WEB">
          <title lang="en">Learning XML</title>
          <author>Erik T. Ray</author>
          <year>2003</year>
          <price>39.95</price>
        </book>
    </Bookstores>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:csv="http://www.ora.com/XSLTCookbook/namespaces/csv">
<xsl:output method="text" />

<xsl:template match="/">
<xsl:for-each select="Bookstores/Bookstore">
<xsl:text>|StoreName|</xsl:text>
 <xsl:for-each select="book">


  <xsl:text>|Title|</xsl:text>
  <xsl:value-of select="title"/>
  <xsl:text>|Author|</xsl:text>
  <xsl:value-of select="author"/>
  <xsl:value-of select="ancestor::Bookstore[1]/@Storenameattribute">
  <xsl:text>&#xa;</xsl:text>
 </xsl:for-each>
</xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

更接近我的需要 - 我希望

|StoreName||Title|Learning XML|Author|Erik T. Ray 
|Title|XQuery Kick Start|Author|James McGovern

我知道“StoreName”栏目当然不会重复,因为我目前在for-each之外。

在这种特殊情况下,我将Storename和Storename属性作为单独的东西,因为我试图找出哪一个可行(真正的XML具有必须处理的元素和属性的混合)。一旦知道他们正在做什么的人都瞥了一眼,我很确定我会遗漏一些显而易见的东西。

1 个答案:

答案 0 :(得分:1)

  

我希望有   | StoreName | Barnes and Noble |标题|学习   XML |作者| Erik T. Ray
  | StoreName | Barnes and Noble |标题| XQuery Kick   开始|作者| James McGovern

如果这是你的目标,你可以简单地使用:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

<xsl:template match="/Bookstores">
    <xsl:for-each select="Bookstore/book">
        <xsl:text>|StoreName|</xsl:text>
        <xsl:value-of select="../Storename"/>
        <xsl:text>|Title|</xsl:text>
        <xsl:value-of select="title"/>
        <xsl:text>|Author|</xsl:text>
        <xsl:value-of select="author"/>
        <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>     
</xsl:template>

</xsl:stylesheet>

要获取Storenameattribute而不是Storename的值,请使用:

<xsl:value-of select="../@Storenameattribute"/>

而不是:

<xsl:value-of select="../Storename"/>

请注意,这需要格式良好的XML作为输入 - 您向我们展示的不是。