【问题标题】:Transform XML data with XSLT使用 XSLT 转换 XML 数据
【发布时间】:2019-07-18 22:50:34
【问题描述】:

我有以下 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。感谢您的帮助!

【问题讨论】:

标签: xml parsing xslt xml-parsing


【解决方案1】:

您可以使用以下脚本:

<?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, '&#xA;')"/>
  </xsl:template>
</xsl:stylesheet>

匹配Stage[@Type = 'Movement']的模板过滤掉 带有 Type="Movement" 的线条。

下一个模板,匹配@Type[matches(., 'Stage')] 执行 将Stage 翻译成N

最后一个模板,匹配Stage 完成主要工作。它:

  • 打印(可能已更改)Type 属性的值。
  • 计算包含Start 属性的变量(nxtStart) 下一个兄弟,但不包括Type = 'Movement',但是 如果不存在,则“代理”值为50000
  • 打印应打印的其余部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多