XSLT xsl:for-each给出了错误

时间:2014-01-22 20:34:49

标签: xslt xslt-2.0 xslt-grouping

我是xslt的初学者。这是在previous question about combinations之后。我想获得年,月,日和小时的详细数据。

XML文件分为两部分,DataSet和Plans ... 我有以下xml文件进行转换:

<Root>
    <DataSets>
        <DataSet Name="Years">
            <Property Name="Year" Value="2001">
                <Property Name="Animal" Value="Tiger"/>
                <Property Name="Priority" Value="0"/>
                <Property Name="Entry">
                    <Property Name="Size" Value="A4"/>
                    <Property Name="ID" Value="1000"/>
                    <Property Name="Name" Value="Company"/>
                    <Property Name="Priority" Value="0"/>
                </Property>
            </Property>
            ....
            <Property Name="Year" Value="2002">
                <Property Name="Animal" Value="Cat"/>
                <Property Name="Priority" Value="2"/>
                <Property Name="Entry">
                    <Property Name="Size" Value="A4"/>
                    <Property Name="ID" Value="1222"/>
                    <Property Name="Name" Value="Company"/>
                    <Property Name="Priority" Value="0"/>
                </Property>
            </Property>
        </DataSet>
        <DataSet Name="Months">
            ....
        </DataSet>
        <DataSet Name="Days">
            ....
        </DataSet>
        <DataSet Name="Hours">
            ....
        </DataSet>
    </DataSets>
    <Plans>
        <Plan Name="Plan_1">
            <Book Name="Book_1">
                <Time Name="AAA">
                    <Property Name="Year" Value="2001"/>
                    <Property Name="Month" Value="01"/>
                    <Property Name="Day" Value="10"/>
                    <Property Name="Hour" Value="12"/>
                </Time>
                <Time Name="BBB">
                    <Property Name="Year" Value="2001"/>
                    <Property Name="Month" Value="01"/>
                    <Property Name="Day" Value="10"/>
                    <Property Name="Hour" Value="12"/>
                </Time>
                <Time Name="CCC">
                    <Property Name="Year" Value="2004"/>
                    <Property Name="Month" Value="02"/>
                    <Property Name="Day" Value="11"/>
                    <Property Name="Hour" Value="04"/>
                </Time>
                <Time Name="DDD">
                    <Property Name="Year" Value="2004"/>
                    <Property Name="Month" Value="03"/>
                    <Property Name="Day" Value="20"/>
                    <Property Name="Hour" Value="04"/>
                </Time>
            </Book>
            <Book Name="Book_22">
                <Time Name="CCC">
                    <Property Name="Year" Value="2001"/>
                    <Property Name="Month" Value="01"/>
                    <Property Name="Day" Value="10"/>
                    <Property Name="Hour" Value="12"/>
                </Time>
                <Time Name="DDD">
                    <Property Name="Year" Value="2002"/>
                    <Property Name="Month" Value="03"/>
                    <Property Name="Day" Value="23"/>
                    <Property Name="Hour" Value="03"/>
                </Time>
                <Time Name="EEE">
                    <Property Name="Year" Value="2002"/>
                    <Property Name="Month" Value="03"/>
                    <Property Name="Day" Value="23"/>
                    <Property Name="Hour" Value="03"/>
                </Time>
                <Time Name="FFF">
                    <Property Name="Year" Value="2004"/>
                    <Property Name="Month" Value="02"/>
                    <Property Name="Day" Value="11"/>
                    <Property Name="Hour" Value="04"/>
                </Time>
            </Book>
        </Plan>
    </Plans>
</Root>

输入xml总共有八个组合(每本书四个)。

我能够组合成四种独特的组合。现在我想获取DataSets的详细信息......输出应该是这样的......

<Times>
   <Time Value="1">
      <Year Value="2001">
          <Property Name="Animal" Value="Tiger"/>
          <Property Name="Priority" Value="0"/>
          <Property Name="Entry">
              <Property Name="Size" Value="A4"/>
              <Property Name="ID" Value="1000"/>
              <Property Name="Name" Value="Company"/>
              <Property Name="Priority" Value="0"/>
          </Property>
      </Property>
      <Month Value="01"/>
          ....
      <Day Value="10"/>
          ....
      <Hour Value="12"/>
          ....
   </Time>
   <Time Value="2">
      <Year Value="2004"/>
          ....
      <Month Value="02"/>
          ....
      <Day Value="11"/>
          ....
      <Hour Value="04"/>
          ....
   </Time>
   <Time Value="3">
      <Year Value="2004"/>
          ....
      <Month Value="03"/>
          ....
      <Day Value="20"/>
          ....
      <Hour Value="04"/>
          ....
   </Time>
   <Time Value="4">
      <Year Value="2002"/>
          ....
      <Month Value="03"/>
          ....
      <Day Value="23"/>
          ....
      <Hour Value="03"/>
          ....
   </Time>
</Times>

这是我到目前为止所拥有的......

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

    <xsl:template name="elementTransform_function">
        <xsl:param name="current_element"/>
        <Property>
            <xsl:attribute name="Name">
                <xsl:value-of select="$current_element"/>
            </xsl:attribute>
            <xsl:for-each select="//DataSets/DataSet/Property[@Value=$current_element]">
            </xsl:for-each>
        </Property>
    </xsl:template>

    <xsl:template match="/">
        <Times>
            <xsl:for-each select="distinct-values(//Time/Property/string-join((Property[@Name='Year']/@Value, Property[@Name='Month']/@Value, Property[@Name='Day']/@Value, Property[@Name='Hour']/@Value), '|'))">
                <xsl:variable name="tokens" select="tokenize(.,'\|')"/>
                <!--  variables  -->
                <xsl:variable name="yy" select="$tokens[1]"/>
                <xsl:variable name="mm" select="$tokens[2]"/>
                <xsl:variable name="dd" select="$tokens[3]"/>
                <xsl:variable name="hh" select="$tokens[4]"/>
                <Time>
                    <xsl:attribute name="Value">
                        <xsl:value-of select="position()"></xsl:value-of>
                    </xsl:attribute>
                    <Year>
                        <xsl:attribute name="Name"><xsl:value-of select="$yy"/></xsl:attribute>
                        <xsl:call-template name="elementTransform_function">
                            <xsl:with-param name="current_element" select="$yy"/>
                        </xsl:call-template>
                    </Year>
                    <Month>
                        <xsl:attribute name="Name"><xsl:value-of select="$mm"/></xsl:attribute>
                        <xsl:call-template name="elementTransform_function">
                            <xsl:with-param name="current_element" select="$mm"/>
                        </xsl:call-template>
                    </Month>
                    <Day>
                        <xsl:attribute name="Name"><xsl:value-of select="$dd"/></xsl:attribute>
                        <xsl:call-template name="elementTransform_function">
                            <xsl:with-param name="current_element" select="$dd"/>
                        </xsl:call-template>
                    </Day>
                    <Hour>
                        <xsl:attribute name="Name"><xsl:value-of select="$hh"/></xsl:attribute>
                        <xsl:call-template name="elementTransform_function">
                            <xsl:with-param name="current_element" select="$hh"/>
                        </xsl:call-template>
                    </Hour>
                </Time>
            </xsl:for-each>
        </Times>
    </xsl:template>
</xsl:stylesheet>

我尝试使用模板,因此我可以在需要时重新使用模板进行替换。但我不能让它工作......它给了我关于没有节点项的错误......我认为这个错误与我分组的方式有关。请帮帮我......

修改

我修复了不同的价值观......

<xsl:for-each select="//DataSets/DataSet/Property[@Value=$current_element]">

这是发生错误的地方......它表示“XPath 2.0表达式中的错误:不是节点项”

0 个答案:

没有答案