我是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表达式中的错误:不是节点项”