新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论XSL,XSLT,XSL-FO,CSS等技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XSL/XSLT/XSL-FO/CSS 』 → [讨论]在xsl中一个奇怪的循环问题。。。。。 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4895 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [讨论]在xsl中一个奇怪的循环问题。。。。。 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     wangyongshan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:39
      积分:184
      门派:XML.ORG.CN
      注册:2007/12/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wangyongshan发送一个短消息 把wangyongshan加入好友 查看wangyongshan的个人资料 搜索wangyongshan在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wangyongshan的博客楼主
    发贴心情 [讨论]在xsl中一个奇怪的循环问题。。。。。

    XML文件如下:
    <root>
       <clue>
             <item id="001" type="aa"/>
             <item id="002" type="bb"/>
             <http id="101" type="cc"/>

       </clue>
    </root>
    想转换成如下格式:
    <root>
        <clue_item>
             <item_aa  id="001"/>
        </clue_item>

        <clue_item>
             <item_bb  id="002"/>
        </clue_item>

         <clue_item>
             <http_cc  id="101"/>
        </clue_item>
    </root>
    我的XSL如下:
    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="//clue"/>
       </root>
    </xsl:template>

    <xsl:template match="clue">
        <xsl:for-each select="./*">
              <xsl:choose>
                 <xsl:when test="name()='item'">
                      <xsl:apply-templates select="//item"/>
                 </xsl:when>

                   <xsl:when test="name()='http'">
                      <xsl:apply-templates select="//http"/>
                 </xsl:when>
             </xsl:choose>
       </xsl:for-each>
    </xsl:template>

    <xsl:template match="item">
        <xsl:choose>
              <xsl:when test="@type='aa'">
                  <clue_item>
                      <xsl:element name="item_aa">
                         <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
                      </xsl:element>
                  </clue_item>
             </xsl:when>

              <xsl:when test="@type='bb'">
                  <clue_item>
                      <xsl:element name="item_bb">
                         <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
                      </xsl:element>
                  </clue_item>
             </xsl:when>

        </xsl:choose>
    </xsl:template>

    <xsl:template match="http">
        <clue_item>
               <http_cc>
                   <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
               </http_cc>
        </clue_item>
    </xsl:template>
    但是转化的结果却出现奇怪的现象:
    <root>
        <clue_item>
             <item_aa  id="001"/>
        </clue_item>

        <clue_item>
             <item_bb  id="002"/>
        </clue_item>

        <clue_item>
             <item_aa  id="001"/>
        </clue_item>

        <clue_item>
             <item_bb  id="002"/>
        </clue_item>

         <clue_item>
             <http_cc  id="101"/>
        </clue_item>
    </root>
    红色的结果出现了重复,item怎么会循环读取2遍啊?
    大家帮忙看下啊.......................


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/21 17:59:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客2
    发贴心情 
    不奇怪,新手总爱犯同样的低级错误,滥用“//”。item和http前不要加,如果不明白,去看一下XPath,要活学活用XSL的话很有必要。

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/21 20:40:00
     
     wangyongshan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:39
      积分:184
      门派:XML.ORG.CN
      注册:2007/12/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wangyongshan发送一个短消息 把wangyongshan加入好友 查看wangyongshan的个人资料 搜索wangyongshan在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wangyongshan的博客3
    发贴心情 
    呵呵,公司的需要,俺才接触xsl,一个超级菜鸟!大哥别见怪,以后要多多教教我啊。。。
    最近一直在写 XML TO XML 的转换器,遇到了超多的问题。。。。哈哈
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/21 21:20:00
     
     wangyongshan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:39
      积分:184
      门派:XML.ORG.CN
      注册:2007/12/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wangyongshan发送一个短消息 把wangyongshan加入好友 查看wangyongshan的个人资料 搜索wangyongshan在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wangyongshan的博客4
    发贴心情 
    你好,我按照你的方法,将item 和 http前面的 // 去掉,但是转换的结果为空。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/21 22:00:00
     
     enyaxp 帅哥哟,离线,有人找我吗?巨蟹座1984-7-4
      
      
      威望:2
      等级:计算机学士学位(版主)
      文章:350
      积分:2433
      门派:XML.ORG.CN
      注册:2007/12/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给enyaxp发送一个短消息 把enyaxp加入好友 查看enyaxp的个人资料 搜索enyaxp在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 点击这里发送电邮给enyaxp  引用回复这个贴子 回复这个贴子 查看enyaxp的博客5
    发贴心情 
    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="//clue"/>
       </root>
    </xsl:template>

    <xsl:template match="clue">
        <xsl:for-each select="./*">
              <xsl:choose>
                 <xsl:when test="name()='item'">
                      <xsl:apply-templates select="."/> //改为“.”,代表当前节点
                 </xsl:when>

                   <xsl:when test="name()='http'">
                      <xsl:apply-templates select="."/> //改为“.”
                 </xsl:when>
             </xsl:choose>
       </xsl:for-each>
    </xsl:template>

    <xsl:template match="item">
        <xsl:choose>
              <xsl:when test="@type='aa'">
                  <clue_item>
                      <xsl:element name="item_aa">
                         <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
                      </xsl:element>
                  </clue_item>
             </xsl:when>

              <xsl:when test="@type='bb'">
                  <clue_item>
                      <xsl:element name="item_bb">
                         <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
                      </xsl:element>
                  </clue_item>
             </xsl:when>

        </xsl:choose>
    </xsl:template>

    <xsl:template match="http">
        <clue_item>
               <http_cc>
                   <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
               </http_cc>
        </clue_item>
    </xsl:template>

    ----------------------------------------------

    I'M BACK, NEVER GO AWAY.

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/22 1:26:00
     
     enyaxp 帅哥哟,离线,有人找我吗?巨蟹座1984-7-4
      
      
      威望:2
      等级:计算机学士学位(版主)
      文章:350
      积分:2433
      门派:XML.ORG.CN
      注册:2007/12/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给enyaxp发送一个短消息 把enyaxp加入好友 查看enyaxp的个人资料 搜索enyaxp在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 点击这里发送电邮给enyaxp  引用回复这个贴子 回复这个贴子 查看enyaxp的博客6
    发贴心情 
    也不算低级错误啦,至少思路是对的。

    只是你用<xsl:apply-templates select="//item"/>匹配模版的时候,匹配到的并不是你所想的
    单个的元素 <item>,而是所有<item>元素;而且因为你有两个item,<xsl:for-each>循环的三次中有两次满足name()='item',这样也就相当于下面的两个item元素被一起扔到template中匹配两次。
             
             <item id="001" type="aa"/>
             <item id="002" type="bb"/>

    这样的重复是平方级的,还好item不算多,要是有100个的话,输出中就会显示10000次item了。初学的时候出这种错很正常。

    ----------------------------------------------

    I'M BACK, NEVER GO AWAY.

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/22 1:40:00
     
     enyaxp 帅哥哟,离线,有人找我吗?巨蟹座1984-7-4
      
      
      威望:2
      等级:计算机学士学位(版主)
      文章:350
      积分:2433
      门派:XML.ORG.CN
      注册:2007/12/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给enyaxp发送一个短消息 把enyaxp加入好友 查看enyaxp的个人资料 搜索enyaxp在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 点击这里发送电邮给enyaxp  引用回复这个贴子 回复这个贴子 查看enyaxp的博客7
    发贴心情 
    当然这种错误其实是可以避免的,这个xsl格式还不够好,需要改进。

    ----------------------------------------------

    I'M BACK, NEVER GO AWAY.

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/22 1:47:00
     
     wangyongshan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:39
      积分:184
      门派:XML.ORG.CN
      注册:2007/12/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wangyongshan发送一个短消息 把wangyongshan加入好友 查看wangyongshan的个人资料 搜索wangyongshan在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wangyongshan的博客8
    发贴心情 
    enyaxp大哥,谢谢你!最近一直在给公司写转换器,遇到了非常多的问题,我只能是一边看xsl的基础语法,一边写。
    enyaxp大哥,我的那个xsl格式不够好,你能不能给点修改的建议啊,我好改进一下啊。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/22 8:34:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/9/8 15:35:03

    本主题贴数8,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    101.563ms