首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成重复记录的xsl和XML转换

生成重复记录的xsl和XML转换
EN

Stack Overflow用户
提问于 2012-08-02 11:36:20
回答 2查看 181关注 0票数 1

我使用以下xml和xsl文件获取重复记录。我只想转换一组列表项。如果可能,请尽量不要从xsl部分中删除任何内容(只需添加到其中)。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<data>
  <listitems name="Select..." CtrId="Id2"/>
  <listitems name="Item A" CtrId="Id2"/>
  <listitems name="Item B" CtrId="Id2"/>
  <listitems name="Select..." CtrId="Id4"/>
  <listitems name="Item A" CtrId="Id4"/>
  <listitems name="Item B" CtrId="Id4"/>  
  <listitems name="Select..." CtrId="Id6"/>
  <listitems name="Item C" CtrId="Id6"/>
  <listitems name="Item D" CtrId="Id6"/>  
</data>
代码语言:javascript
复制
  <xsl:template match="data/listitems">
    <html>
      <head>
        <title>Untitled</title>
      </head>
      <body>
        <xsl:value-of select="@name"/>
      </body>
    </html>
  </xsl:template>

结果(错误行为;重复)选择...物料A物料B选择...项目A项目B

所需行为(仅获取1组)选择...项目A项目B

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-02 21:38:46

下面是一种相对简单的方法:

代码语言:javascript
复制
<xsl:param name="useId" select="/data/listitems[1]/@CtrId" />

<xsl:template match="/">
  <html>
    <head>
      <title>Untitled</title>
    </head>
    <body>
      <xsl:apply-templates select="data/listitems[@CtrId = $useId]"/>
    </body>
  </html>
</xsl:template>

<xsl:template match="listitems">
  <xsl:value-of select="concat(@name, ' ')" />
</xsl:template>

您现有的模板实际上会为每个listitems元素放入一个html元素-看起来您很可能只需要一个。

顶部的<xsl:param>声明挑选文件中的第一个CtrId,并使用它。您可以使用select="'Id2'"将其更改为文字值(请注意双引号中的单引号),或者可以将一个参数传递到带有您想要选取的ID的样式表中。

票数 1
EN

Stack Overflow用户

发布于 2012-08-02 12:21:29

此转换

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/*">
    <html>
      <head>
        <title>Untitled</title>
      </head>
      <body>
       <xsl:apply-templates select=
          "*[starts-with(@name,'Select')][1]"/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="*[starts-with(@name,'Select')]">
    <xsl:apply-templates mode="inGroup" select=
    "(.|following-sibling::*
        [generate-id(following-sibling::*
                     [@name[starts-with(.,'Select')]][1]
                     )
        =
         generate-id(current()/following-sibling::*
                               [@name[starts-with(.,'Select')]][1])
        ]
     )/@name
    "/>
  </xsl:template>

  <xsl:template match="@name" mode="inGroup">
   <xsl:value-of select="concat(., ' ')"/>
  </xsl:template>
</xsl:stylesheet>

在所提供的XML文档上应用时的

代码语言:javascript
复制
<data>
  <listitems name="Select..." CtrId="Id2"/>
  <listitems name="Item A" CtrId="Id2"/>
  <listitems name="Item B" CtrId="Id2"/>
  <listitems name="Select..." CtrId="Id4"/>
  <listitems name="Item A" CtrId="Id4"/>
  <listitems name="Item B" CtrId="Id4"/>
</data>

会生成想要的正确结果:

代码语言:javascript
复制
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

      <title>Untitled</title>
   </head>
   <body>Select... Item A Item B </body>
</html>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11770707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档