1

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

<?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>

 

  <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

4

2 回答 2

1

这是一个相对简单的方法:

<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>

您现有的模板实际上会html为每个listitems元素添加一个元素 - 您似乎很可能只想要一个。

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

于 2012-08-02T13:38:45.550 回答
1

这种转变

<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 文档时

<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>

产生想要的正确结果:

<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>
于 2012-08-02T04:21:29.463 回答