如何从xml,xslt获得正确的结果?

时间:2017-01-10 17:30:33

标签: xml xslt

我想尝试这个例子:

文件:Data.xml

{
    0: {
         field: 'user[username]',
         errors: [
             'message of error 1',
             'message of error 2'
         ]
    },
    1: {
        field: 'user[group][id]',
        errors: [
             'message of error 1'
        ]
    }
}

文件:Transform.xslt

 <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="Transform.xslt"?>
<addressbook>
  <address>
    <first-name>Doris</first-name>
    <last-name>Smith</last-name>
    <city>New York</city>
    <state>WI</state>
  </address>
  <address>
    <first-name>Mary</first-name>
    <last-name>Smith</last-name>
    <city>Vancouver</city>
    <state>MA</state>
  </address>

预期的输出是:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:text>Customers grouped by state&#xA;&#xA;</xsl:text>
    <xsl:for-each-group select="/addressbook/address" group-by="state">
      <xsl:sort select="state"/>
      <xsl:text>  State = </xsl:text>
      <xsl:value-of select="current-grouping-key()"/>
      <xsl:text>&#xA;</xsl:text>
      <xsl:for-each select="current-group()">
        <xsl:text>&#x9;</xsl:text>
        <xsl:value-of select="(first-name, last-name)" separator=" "/>
        <xsl:text>, </xsl:text>
        <xsl:value-of select="city"/>
        <xsl:text>&#xA;</xsl:text>
      </xsl:for-each>
    </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

但我拥有的是:

Doris Smith纽约WI Mary Smith温哥华

如果你能向我解释这个问题,我将非常感激。

1 个答案:

答案 0 :(得分:0)

您似乎正在使用浏览器根据XML文件中的xml-stylesheet处理指令处理XSLT。

不幸的是,如果没有Saxon-CESaxon-JS这样的内容,您将无法在浏览器中运行XSLT 2.0转换。

这是一个使用Muenchian Grouping的XSLT 1.0选项,该选项应该有效......

XML输入

<?xml-stylesheet type="text/xsl" href="Transform.xslt"?>
<addressbook>
    <address>
    <first-name>Doris</first-name>
    <last-name>Smith</last-name>
    <city>New York</city>
    <state>WI</state>
  </address>
    <address>
    <first-name>Mary</first-name>
    <last-name>Smith</last-name>
    <city>Vancouver</city>
    <state>MA</state>
  </address>
</addressbook>

XSLT 1.0 (Transform.xslt)

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

  <xsl:key name="address" match="address" use="state"/>

  <xsl:template match="/addressbook">
    <xsl:text>Customers grouped by state&#xA;&#xA;</xsl:text>
    <xsl:for-each select="address[count(.|key('address',state)[1])=1]">
      <xsl:sort select="state"/>
      <xsl:value-of select="concat('&#x9;',state,'&#xA;')"/>
      <xsl:for-each select="key('address',state)">
        <xsl:value-of select="concat('&#x9;',
          first-name,' ',last-name,
          ', ',city,'&#xA;')"/>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

<强>输出

Customers grouped by state

    MA
    Mary Smith, Vancouver
    WI
    Doris Smith, New York