我是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>
答案 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>