使用xslt转换创建带有页眉和页脚的xsl转换xml到另一个xml,

时间:2017-06-13 15:43:45

标签: xml xslt xslt-1.0

我是XSLT的新手,我有一个从csv文件转换而来的XML,如下所示,Open和Close行受文本干扰,输入行和值。它们都带有相同的记录标签,  区别仅在字符串值本身

var firebaseHeadingRef6 = firebase.database().ref('pond2/temperature');

firebaseHeadingRef6.orderByChild("{key}/processdata/timestamp").limitToLast(2).on("value", function(snapshot) {
        console.log(snapshot.val());

});

我希望结果如下所示。我尝试使用变量存储使用变量“Type”来存储加号或减号,但似乎我无法更新变量。任何人都可以创建一个可以进行以下转换的xsl。

<?xml version="1.0" encoding="utf-8"?>
<Items>
<Row>
  <Transaction>Open</Transaction>
</Row>
<Row>
  <Transaction>Type plus</Transaction>
</Row>
<Row>
  <Transaction>A</Transaction>
</Row>
<Row>
  <Transaction>B</Transaction>
</Row>    
<Row>
  <Transaction>Close</Transaction>
</Row>
<Row>
  <Transaction>Open</Transaction>
</Row>
<Row>
  <Transaction>Type minus</Transaction>
</Row>
<Row>
  <Transaction>C</Transaction>
</Row>
<Row>
  <Transaction>D</Transaction>
</Row>    
<Row>
  <Transaction>Close</Transaction>
</Row>
...
...
...
...
...   
</Items>

1 个答案:

答案 0 :(得分:1)

这个例子很模糊;我们这里需要的是一些明确的规则。

如果我们假设在以Row开头的每个<Transaction>Open</Transaction>组中,第二个Row包含该类型,最后一个关闭该组,我们可以这样做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="grp" match="Row[not(Transaction='Open')]" use="generate-id(preceding-sibling::Row[Transaction='Open'][1])" />

<xsl:template match="Items">
    <result>
        <xsl:for-each select="Row[Transaction='Open']">
            <xsl:variable name="group" select="key('grp', generate-id())" />
            <xsl:variable name="type" select="substring-after($group[1]/Transaction, 'Type ')" />
            <xsl:for-each select="$group[position() != 1 and position() != last()]">            
                <message>
                    <to>
                        <xsl:value-of select="$type"/>
                    </to>
                    <from>
                        <xsl:value-of select="Transaction"/>
                    </from>
                </message>
            </xsl:for-each>
        </xsl:for-each>
    </result>
</xsl:template>

</xsl:stylesheet>

获得:

<?xml version="1.0" encoding="UTF-8"?>
<result>
  <message>
    <to>plus</to>
    <from>A</from>
  </message>
  <message>
    <to>plus</to>
    <from>B</from>
  </message>
  <message>
    <to>minus</to>
    <from>C</from>
  </message>
  <message>
    <to>minus</to>
    <from>D</from>
  </message>
</result>