以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  xslt 循环嵌套问题(不知道是不是这么表述)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=68926)


--  作者:飞花
--  发布时间:10/31/2008 1:27:00 PM

--  xslt 循环嵌套问题(不知道是不是这么表述)
有个xml文件,在根目录下有两个子节点(当然子节点下还有好多级子节点),第一个子节点是对变量的定义,包括变量名称 数据类型,初始值等信息,第二个节点是对每个变量的注释。

解析结果:把每个变量的信息都放在一起:名称,类型,初始值,注释。

问题:我在第一个节点里面做for-each循环,怎么在里面再调用模板把注释也对应进去。


--  作者:Qr
--  发布时间:10/31/2008 6:14:00 PM

--  
在for-each遍历定义变量的节点的同时,通过[命名模板]<xsl:call-template>调用注释节点中对应的变量注释。
<for-each ...>
<xsl:value-of select="名称"/>
<xsl:value-of select="类型"/>
<xsl:value-of select="初始值"/>
<xsl:call-template .../><!--可以结合<xsl:with-param>去传递变量以便从注释节点中取得对应的变量注释。-->
</for-each>
--  作者:飞花
--  发布时间:11/2/2008 2:53:00 PM

--  
这种方法早就试过了,调用模板,设置参数等等,就是无法获得想要的结果。


--  作者:飞花
--  发布时间:11/2/2008 3:57:00 PM

--  
我想知道如果进入到某个子级节点下进行for-each循环,在循环里是否能调用这个子级目录以外的节点数据(比如和它并列的子级节点)
--  作者:Qr
--  发布时间:11/3/2008 12:09:00 PM

--  
以下是引用飞花在2008-11-2 14:53:00的发言:
这种方法早就试过了,调用模板,设置参数等等,就是无法获得想要的结果。


那我只能认为你对XSL不熟悉,特别是命名模板和XPath不熟悉。
--  作者:Qr
--  发布时间:11/3/2008 12:11:00 PM

--  
以下是引用飞花在2008-11-2 15:57:00的发言:
我想知道如果进入到某个子级节点下进行for-each循环,在循环里是否能调用这个子级目录以外的节点数据(比如和它并列的子级节点)


还是XPath的问题,可以,只要指明节点路径即可。
--  作者:hexun831012
--  发布时间:11/3/2008 12:17:00 PM

--  
<xsl:template match="/">
  <xsl:apply-templates select="你的节点名称"/>
</xsl:template>
<xsl:template match="你的节点名称">
  <xsl:value-of select="名称"/>
  <xsl:value-of select="类型"/>
  <xsl:value-of select="初始值"/>
  <xsl:value-of select="comment()"/>
</xsl:template>
小妹妹,你要走的路还很长。。。
QR在线!!!
--  作者:飞花
--  发布时间:11/3/2008 2:11:00 PM

--  
从我知道有xslt这种语言不过三五天而已,是不可能把xpath运用很熟练的。。。。。。。
现在我是先把文档里面的注释单独解析出来,然后再用document调用,合并。。。。虽然有点笨,不过结果还是出来了,现在唯一不爽的就是调用的文件名,每次都要更改,打算弄成可选的。等这个弄好再研究怎么在一个文件里解析。。。。。


--  作者:飞花
--  发布时间:11/3/2008 5:22:00 PM

--  
终于搞定了。

<xsl:variable name="groupname " select="DIAGRAM/SUBST[@VAR='SGR_NAME']/@VAL "/>
<xsl:value-of select="//OPERATE[count(*)=2][contains(@NAME,$groupname)]/SUBST[@VAR='RCV_LIST']/@VAL"/>

定义了一个参数,然后把变量名匹配用@NAME


--  作者:hexun831012
--  发布时间:11/3/2008 5:25:00 PM

--  
眼花缭乱
--  作者:Qr
--  发布时间:11/3/2008 5:50:00 PM

--  
以下是引用hexun831012在2008-11-3 17:25:00的发言:
眼花缭乱


不能打击新人!!!
刚学几天,能这样写代码,已经不错了,虽然我不理解什么意思。
--  作者:飞花
--  发布时间:11/4/2008 6:55:00 PM

--  
很乱吗?我已经简化很多了,唉,要是看见源文件的结构就不会说很乱了。。。。。。
源文件里面并不是简单的变量注释,里面有很多信息,全部是<OPERATE>并列结构。
OPERATE[count(*)=2],是选择有两个子节点的OPERATE元素。
[contains(@NAME,$groupname)],是变量名相对应那个OPERATE元素节点。
/SUBST[@VAR='RCV_LIST']/@VAL"是OPERATE元素两个子节点SUBST中VAR="RCV_LIST"的那个节点元素,然后取VAL的值就是我需要的了。。。。。

--  作者:hexun831012
--  发布时间:11/5/2008 9:20:00 AM

--  
以下是引用飞花在2008-11-4 18:55:00的发言:
很乱吗?我已经简化很多了,唉,要是看见源文件的结构就不会说很乱了。。。。。。
源文件里面并不是简单的变量注释,里面有很多信息,全部是<OPERATE>并列结构。
OPERATE[count(*)=2],是选择有两个子节点的OPERATE元素。
[contains(@NAME,$groupname)],是变量名相对应那个OPERATE元素节点。
/SUBST[@VAR='RCV_LIST']/@VAL"是OPERATE元素两个子节点SUBST中VAR="RCV_LIST"的那个节点元素,然后取VAL的值就是我需要的了。。。。。



你最好把文档结构发上来,可能简单得令你无法想象。
--  作者:飞花
--  发布时间:11/5/2008 10:05:00 AM

--  
<AUTOCREATE>
 <FOLDER NAME="工程">
  <FOLDER NAME="项目">
   <FOLDER NAME="定义">
    <FOLDER NAME="Stromrichterwagen" MODULE="MDL1">
     <FOLDER NAME="#SKS32" MODULE="MDL1">
      <GROUP ID="P_SW_SKS32_EW_ZSGM_1" DIR="HOR" WIDTH="0" HSPACE="1" VSPACE="1"/>
      <DIAGRAM TEMPLATE="BL_EP_ANTIVALENT2_3.xml" NAME="#SW_SKS32_EW_ZSGM_1" GROUP="P_SW_SKS32_EW_ZSGM_1">
       <SUBST VAR="CYCLE" VAL="3"/>
       <SUBST VAR="DELTA" VAL="500"/>
       <SUBST VAR="SGR_NAME" VAL="SW_SKS32_EW_ZSGM_1"/>
       <SUBST VAR="SIG_NAME" VAL="SW_E32"/>
       <SUBST VAR="CON_NAME" VAL="SW_SKS32_EW_ZSGM_1.SW_E32"/>
       <SUBST VAR="SIG_TYPE" VAL="ANTIVALENT2"/>
      </DIAGRAM>
此处省略多个<DIAGRAM>……</DIAGRAM>
     </FOLDER>
此处省略多个<FOLDER>……</FOLDER>
    </FOLDER>
   </FOLDER>
  </FOLDER>
  <FOLDER NAME="项目">
   <FOLDER NAME="详细信息">
    <FOLDER NAME="Stromrichterwagen">
     <FOLDER NAME="#SKS32">
      <GROUP ID="B_SW_SKS32_EW_ZSGM_1" DIR="HOR" WIDTH="0" HSPACE="1" VSPACE="1"/>
      <OPERATE TEMPLATE="BL_HB_DEV_3.xml" NAME="#SW_SKS32_EW_ZSGM_1" GROUP="B_SW_SKS32_EW_ZSGM_1">
       <SUBST VAR="DEV_NAME" VAL="SKS32"/>
      </OPERATE>
      <OPERATE TEMPLATE="BL_HB_GROUP_3.xml" NAME="#SW_SKS32_EW_ZSGM_1" GROUP="B_SW_SKS32_EW_ZSGM_1">
       <SUBST VAR="SGR_NAME" VAL="SW_SKS32_EW_ZSGM_1"/>
       <SUBST VAR="RCV_LIST" VAL="EW/ZSGM EW/ZSGS"/>
      </OPERATE>
      <OPERATE TEMPLATE="BL_HB_BSIGNALLIST_3.xml" NAME="#SW_SKS32_EW_ZSGM_1" GROUP="B_SW_SKS32_EW_ZSGM_1">
</OPERATE>
      <OPERATE TEMPLATE="BL_EB_ANTIVALENT2_3.xml" NAME="#SW_SKS32_EW_ZSGM_1" GROUP="B_SW_SKS32_EW_ZSGM_1">
       <SUBST VAR="SGR_NAME" VAL="SW_SKS32_EW_ZSGM_1"/>
       <SUBST VAR="SIG_NAME" VAL="SW_E32"/>
       <SUBST VAR="CON_NAME" VAL="SW_SKS32_EW_ZSGM_1.SW_E32"/>
       <SUBST VAR="LABLE" VAL="SW_E32"/>
      </OPERATE>
此处省略多个<OPERATE></OPERATE>
     </FOLDER>
此处省略多个<FOLDER></FOLDER>


    </FOLDER>
   </FOLDER>
  </FOLDER>
 </FOLDER>
</AUTOCREATE>


变量类型从“SIG_TYPE”读取,并进行类型转换


--  作者:hexun831012
--  发布时间:11/5/2008 8:03:00 PM

--  
<xsl:template match="AUTOCREATE">
  <xsl:apply-templates select="FOLDER"/>
</xsl:template>
<xsl:template match="FOLDER">
  <xsl:value-of select="NAME"/>
  <xsl:apply-templates select="FOLDER | GROUP | DIAGRAM"/>
</xsl:template>
...
你的意思是不是递归FOLDER节点,对XSL来说太容易了,你试试如上代码吧。
你的文档格式语义太弱,而且全是大写,看起来真费尽。
恕在下无能,看不懂你的文档是做啥用的。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
97.656ms