以文本方式查看主题

-  W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  两个看似简单却难解的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=66472)


--  作者:宇义
--  发布时间:8/27/2008 4:17:00 PM

--  两个看似简单却难解的问题
1,如何判断当前节点类型

假设一个模板同时匹配属性和元素,那么在这个模板内部如何判断匹配的结点类型?

<xsl:template match="@* | *">
当前节点是属性还是元素?
</xsl:template>

2,如何判断两个节点为同一个

<xml>
 <node1>test</node1>
 <node2>test</node2>
</xml>

<xsl:variable name="node1" select="node1" />
<xsl:variable name="node2" select="node2" />
<xsl:value-of select="node1 = node2" />

显然不行,判断的是内容是否相同,这里非同一节点因其内容均为test所以为true。

我暂时用 <xsl:value-of select="generate-id(node1) = generate-id(node2)" />可行,但担心效率问题。


--  作者:Qr
--  发布时间:8/28/2008 12:51:00 PM

--  
1、确实找不到判断的方法或函数,也许W3C觉得这样做没意义吧
2、判断两个节点为同一个,除了generate-id(),好象没有更好的办法了。
就算是元素名和值都一样,还有position的问题,比如祖先节点、子孙节点,用代码去遍历恐怕效率更低。
--  作者:宇义
--  发布时间:8/28/2008 1:47:00 PM

--  
多谢!

今天偶然发现exslt的has-same-child:

<xsl:template name="set:has-same-node">
   <xsl:param name="nodes1" select="/.." />
   <xsl:param name="nodes2" select="/.." />
   <xsl:value-of
      select="boolean($nodes1[count(.|$nodes2) = count($nodes2)])" />
</xsl:template>

看内容应该是判断节点相同的。个人觉得真的是很巧妙的方法。


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