我有以下xml数据
<UserStaging>
<NeuroRKStaging>
<Stage Type="REM" Start="0" />
<Stage Type="Stage3" Start="150" />
<Stage Type="Movement" Start="3030" />
<Stage Type="Wake" Start="3150" />
<Stage Type="Stage2" Start="4680" />
<Stage Type="Stage3" Start="5340" />
<Stage Type="Movement" Start="6090" />
<Stage Type="Wake" Start="6480" />
<Stage Type="Stage1" Start="9330" />
<Stage Type="Stage3" Start="10290" />
</NeuroRKStaging>
</UserStaging>
我必须将其设置为以下格式:
REM 150
N2 3150
Wake 4680
N2 5340
N3 6480
Wake 9330
N1 10290
N3 50000
有五种“类型”:
Stage1 transforms to N1
Stage2 transforms to N2
Stage3 transforms to N3
REM remains REM
Wake remains Wake
所有具有Type =“ Movement”的行都应删除,只有在此之后才对数据进行转换。接下来的每个阶段的“开始”将是其前面“类型”后面的数字。对于最后一个“类型”(在此例N3中),该数字应为50000
xsl样式表看起来如何做到这一点?我最多可以使用XSLT版本3。谢谢您的帮助!
答案 0 :(得分:0)
您可以使用followig脚本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Stage[@Type = 'Movement']"/>
<xsl:template match="@Type[matches(., 'Stage')]">
<xsl:value-of select="concat('N', substring(., 6))"/>
</xsl:template>
<xsl:template match="Stage">
<xsl:apply-templates select="@Type"/>
<xsl:variable name="nxtStart" select="
(following-sibling::*[not(@Type = 'Movement')][1]/@Start, 50000)[1]"/>
<xsl:value-of select="concat(' ', $nxtStart, '
')"/>
</xsl:template>
</xsl:stylesheet>
匹配Stage[@Type = 'Movement']
的模板会过滤掉
带有Type =“ Movement”的行。
匹配@Type[matches(., 'Stage')]
的下一个模板执行
将Stage
转换为N
。
最后,匹配Stage
的最后一个模板完成了主要工作。它:
Type
属性的值。nxtStart
属性的变量(Start
)
下一个同级,但排除带有Type = 'Movement'
的同级,但
如果不存在,则“代理”值为50000
。