以文本方式查看主题

-  中文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=84738)


--  作者:guduke
--  发布时间:5/13/2010 9:37:00 AM

--  XSLT 路径的属性可否传入参数
<CATALOG>
<edition category="102">
 <item>
  <name>苏教版</name>
  <id>1</id>
 </item>
 <item>
  <name>苏科版</name>
  <id>2</id>
 </item>  
</edition>
<edition category="103">
 <item>
  <name>苏教版103</name>
  <id>1</id>
 </item>
 <item>
  <name>苏科版103</name>
  <id>2</id>
 </item>  
</edition>
<edition category="104">
 <item>
  <name>苏教版104</name>
  <id>1</id>
 </item>
 <item>
  <name>苏科版104</name>
  <id>2</id>
 </item>  
</edition>
</CATALOG>


这个XML 我想根据不同的属性值选出不同的节点下面的值 组成url

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pe="labelproc" exclude-result-prefixes="pe">
<xsl:param name="t" />
<xsl:param name="nodeId" />
<xsl:output method="html" />
<xsl:template match="/">
<xsl:for-each select="/CATALOG/edition[@category='102']/item">
<li id="MenuID_1_0)">
<a href="/Category_{$nodeId}/Index.aspx?edition=xx">
<xsl:value-of select="name"/>
</a>
</li>
<li id="MenuID_1_1)">
<a href="/Category_{$nodeId}/Index.aspx?edition=xx">
<xsl:value-of select="name"/>
</a>
</li>
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

红色的102可否为变量啊。就是通过传递不同的102 103 选取不同的节点。

还有 红色的xx 应该是<xsl:value-of select="id"/>应该如何合成完整的URL呢

红色的id 的0 1如何根据这个xml循环下来呢?
还有上面xml怎么组织更合理啊。对组成URL更方便效率更高呢。谢谢!


--  作者:jj_long
--  发布时间:5/13/2010 10:00:00 AM

--  
在XSLT语言里,使用得跟多的是match template的方式,而很少用for-each循环。

以下是match template方式的代码。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pe="labelproc" exclude-result-prefixes="pe">

<xsl:output method="html" />

<xsl:template match="/">
 <xsl:apply-templates/>
</xsl:template>


<xsl:template match="edition">
 <li id="MenuID_1_{id}">
  <a href="/Category_{@category}/Index.aspx?edition={substring(name,string-length(name) - 3}"> <!-- edition的值是name元素值的后三位?) -->
   <xsl:value-of select="name"/>
  </a>
 </li>
</xsl:template>

</xsl:stylesheet>


--  作者:guduke
--  发布时间:5/13/2010 10:42:00 AM

--  
你好,这个位置搞错了。id应该在edition后面的。你写的ID应该是从0开始的序号 0 1 2... 应该怎么写啊?


怎么样通过赋值不同的比如102 103 来选择不同的子节点呢。

[color=#FF0000]="/CATALOG/edition[@category='102']/item[/color]

<xsl:template match="edition">edition[@category='102']应该如何写路径
<li id="MenuID_1_{序号}">
  <a href="/Cat_{$nodeid}/Index.aspx?edition={id}"> <!-- edition的值是name元素值的后三位?) -->
   <xsl:value-of select="name"/>
  </a>
</li>
</xsl:template>

因为要用又不太懂。谢谢啊!


for循环那有什么不好啊?谢谢。还有我这个xml文件应该怎么写结构更好啊。谢谢!

我的目的是。一个xml文档 category是不同节点的属性。 有节点 我实际使用的时候就是只需要选择不同的节点。然后组织成自己的url 而选择不同节点是通过传递参数的进去选择的。


--  作者:jj_long
--  发布时间:5/14/2010 12:02:00 AM

--  
如果<li id="MenuID_1_{id}">中的id是序号且只要求唯一可以考虑使用<li id="MenuID_1_{generate-id()}">或者<li id="MenuID_1_{position()}">


Q: 怎么样通过赋值不同的比如102 103 来选择不同的子节点呢。
A: 看以下是否是你想要的:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pe="labelproc" exclude-result-prefixes="pe">

<xsl:param name="p_category"/>
<xsl:output method="html" />

<xsl:template match="/">
<xsl:apply-templates select="/CATALOG/edition[@category=$p_category]"/>
</xsl:template>


<xsl:template match="edition">
<li id="MenuID_1_{id}">
  <a href="/Category_{@category}/Index.aspx?edition={substring(name,string-length(name) - 3}"> <!-- edition的值是name元素值的后三位?) -->
   <xsl:value-of select="name"/>
  </a>
</li>
</xsl:template>

</xsl:stylesheet>

对XSLT,我的体会是:for循环是主动去找数据,然后处理。而template是被动地被调用。在XSLT里这两种方法都有非常有用。但是尽量使用后一种方式。我的理由是:
在XSLT中最容易出现的问题就是漏数据,即:有数据在XML里边,但是没有调用到相应的template,导致没有输出的数据。 如果使用for循环主动去找数据,容易(注意:是容易而不是一定)出现漏数据的问题。


--  作者:guduke
--  发布时间:5/14/2010 10:46:00 AM

--  
如果<li id="MenuID_1_{id}">中的id是序号且只要求唯一可以考虑使用<li id="MenuID_1_{generate-id()}">或者<li id="MenuID_1_{position()}"> 我想编号从0开始是不是就是position()-1吧。谢谢。这个问题解决 多谢帮助。!

另外能不能麻烦你帮我看看这个问题。

http://bbs.xml.org.cn/dispbbs.asp?boardID=8&ID=84715

我的困惑现在是

你好,我的意思<xsl:value-of select="Field"/>是我从数据库中查询出来的。我要从这个<xsl:value-of select="Field"/>中。查询出FieldInfo[@Id='version']/Settings/string[1]"的内容。怎么样写路径才能使得这个路径得到是<xsl:value-of select="Field"/>字段中的文档中的FieldInfo[@Id='version']/Settings/string[1] 路径的值。不晓得我表达清楚了没有。

也就是我不晓得 从数据库中查询的<xsl:value-of select="Field"/> 中怎么样在xslt中来引用,从而写出 这个字段中存的xml文档的值。

再次感谢!


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