【问题标题】:Use XSLT to convert separators into wrappers使用 XSLT 将分隔符转换为包装器
【发布时间】:2012-10-20 15:28:50
【问题描述】:

我有一段想要用 XSLT 转换的 XML(使用 xsltproc——所以只有 XSLT 1.0)。原始 XML 使用一些标签作为分隔符,如下所示:

<container>
  <element />
  <element />
  <separator />
  <element />
  <element />
  <element />
  <separator />
  <element />
</container>

我需要将其转换为包装这些元素的格式。所以我需要它看起来像这样:

<container>
  <wrapper>
    <element />
    <element />
  </wrapper>
  <wrapper>
    <element />
    <element />
    <element />
  </wrapper>
  <wrapper>
    <element />
  </wrapper>
</container>

我似乎无法设计实现这一目标的模板。有人有什么想法吗?

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    这种转变

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:key name="kFollowing" match="element"
              use="generate-id(preceding-sibling::separator[1])"/>
    
     <xsl:template match="/*">
         <container>
           <xsl:apply-templates select=
           "element
                [generate-id()
                =
                 generate-id(key('kFollowing',
                                 generate-id(preceding-sibling::separator[1])
                                 )[1]
                            )
                 ]"/>
         </container>
     </xsl:template>
    
     <xsl:template match="element">
      <wrapper>
        <xsl:copy-of select=
        "key('kFollowing',
             generate-id(preceding-sibling::separator[1])
             )"/>
      </wrapper>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于提供的 XML 文档时:

    <container>
        <element />
        <element />
        <separator />
        <element />
        <element />
        <element />
        <separator />
        <element />
    </container>
    

    产生想要的正确结果

    <container>
       <wrapper>
          <element/>
          <element/>
       </wrapper>
       <wrapper>
          <element/>
          <element/>
          <element/>
       </wrapper>
       <wrapper>
          <element/>
       </wrapper>
    </container>
    

    【讨论】:

    • 谢谢!我没有想过像那样使用 key 和 generate-id。
    • @JeffKing,不客气。这是“位置”分组的变体。这在 XSLT 2.0 中更容易实现,
    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多