XSLT问答:变量与路径



=gb2312\">XSLT问答:变量和路径

XSLT问答:变量和路径

原作:John E. Simpson 2002.06.26
翻译: _disibledevent=>这里个由select属性给出XPath表达式串值赋予个给定 name变量以后就可以引用这个变量思路方法是在它名字前加上美元符号($)例如:

<xsl:value-of select=\"$empname\"/>

如果 empname变量值为 \"Munchausen\"xsl:value-of 元素就在当前结果树中生成串\"Munchausen\"

XSLT中最容易引人上当圈套就是个变量只在该 xsl:variable父元素上下文(context)中才有意义这就是所谓变量作用域你可以在样式表中创建xsl:variable作为根元素xsl:stylesheet子元素来声明个全局变量--即在样式表任何地方都可以访问变量举例来说:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="booktitle" select="/book/@title"/> ... </xsl:stylesheet>

(这就可以避免在样式表中重复出现复杂XPath表达式同时又使样式表更容易理解和维护)

但是 xsl:variable又可以作为XSLT名称空间内几乎所有其它元素子元素例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="book"> <xsl:variable name="booktitle" select="@title"/> <xsl:> <xsl:when test="sub($booktitle,1,1) &lt;= \'M\'"> [书名在字母表中位于前半部分时应用模板] </xsl:when> <xsl:otherwise> [书名在字母表中位于后半部分时应用模板] </xsl:otherwise> </xsl:> </xsl:template> ... </xsl:stylesheet>



上面模板中变量booktitle值会随着给定book元素title属性值而变化不错它可以变化但对于任何给定book元素它是不变

我没看到提问者代码他似乎想这么做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="book"> <xsl:> <xsl:when test="sub(@title,1,1) &lt;=\'M\'"> <xsl:variable name="somevar" select="[XPath 表达式]"/> [书名在字母表中位于前半部分时应用模板] </xsl:when> <xsl:otherwise> <xsl:variable name="somevar" select="[XPath表达式]"/> [书名在字母表中位于后半部分时应用模板] </xsl:otherwise> </xsl:> </xsl:template> ... </xsl:stylesheet>

这里有几个潜在问题xsl:variable元素父元素现在是xsl:when元素因而该变量不在其它元素xsl:otherwise元素中更重要不管你把xsl:variable放在哪里值不会改变上例中somevar声明了两次你实际上创建了两个变量只不过它们名字恰好相同而其作用范围完全区别:个在xsl:when元素内个在xsl:otherwise

我认为要理解XSLT变量行为或者为解决你问题(虽然可能不是你想要方案)最好办法是阅读Dave PawsonXSLT FAQ特别是有关变量部分

问:只用个DTD能否取得所有可能文件路径 (How do I extract all possible document paths using just a DTD)?

我试图从个给定DTD中取得所有路径:对于每个DTD都存在有个节点树对于每个节点都存在条从根节点到该节点路径处理这个问题有没有简单办法?我要取出所有这些路径并把它们存储到关系数据库中

答:我猜没有这个问题没有简单解决的道对于个XML应用DTD给出了它有效文档结构总体图但是没有对所有可能有效文档定义出其特定结构



假如你有这样个简单DTD:

<!ELEMENT root_elem (child_elem+)>
<!ELEMENT child_elem (grandchild_elem*)>
<!ELEMENT grandchild_elem (#PCDATA)>


从这个DTD中只能得出这些信息:目前应用中个有效文档有个根元素root_elem这个根元素有个或多个child_elem元素它(child_elem)可能又有01或多个grandchild_elem元素如果我没理解错在你提问中这句话有问题--“...对于每个DTD都存在有个节点树”实际上不对对于每个DTD至少存在个+, *, 以及 ?, 可能节点树数量急剧增加直到无穷大(如果用了 + 或 * 操作符)

你提到了RDBMS是我怀疑你下步是不是要根据DTD描述结构建立个数据库也就是说怎样这两者的间建立映射对这类问题不能不使人想到Ron Bourret(XML和数据库资料站开发者)他有篇文章可作为入门

问:从哪里可以获得基于XML货币报价?(Where can I get XML-based currency quotes?)

我想在我站点以CHF(瑞士法郎)发布价格也想以欧元表示这样每当页面请求时出现是实际报价但从哪里得到这些报价?答:有关这类信息渠道有很多在我熟悉当中比较简单叫做 CEWS(the Currency Exchange Web Service)出自 duzine.com(注册用户可获得用于开发目单个CPU授权提供了21种国际货币报价包括瑞士法郎、欧元以及美元、英镑、日元、荷兰盾等等)

CEWS网页上有个例子演示了CEWS消息简单结构:

<?xml version="1.0" ?> <CEWS> <DATE>21 August 2001</DATE> <BASE>EUR</BASE> <CURRENCY_LIST> <ATS>13.7603</ATS> <AUD>1.7110</AUD> <CAD>1.4107</CAD> <CHF>1.5166</CHF> ... </CURRENCY_LIST> </CEWS>

DATE元素代表当前报价正确日期BASE元素代表报价基本货币单位CURRENCY_LIST元素子元素代表相应货币名缩写在上例中表示奥地利先令、澳元、加拿大元和瑞士法郎在当天价格分别为13.7603, 1.7110, 1.4107, 和 1.5166 欧元

正如CEWS网页上所指出那样这种信息结构非常紧凑容易处理它不需要SOAP包装也不必通过DTD或XML Schema验证

还有许多来源可以提供相似解决方案如Evergreen.com, Oanda, Cloanto如你所料如果你想在软件Software开发用途的外使用这些数据做些别事情没有几个是免费提供你也可以到/n Software IPWorks Internet Toolkit 看看那里支持各种各样平台还有个货币转换演示最后有关基于SOAP货币转换请看XMethods \"Euro Conversor\"站点

作者介绍:John E Simpson 是Just XML(Prentice Hall PTR;将出第 2版)作者经常在XML邮件列表上发表文章特别是在XML-L方面他有20多年应用开发经验目前是佛罗里达州几个非盈利组织网管



Tags: 

延伸阅读

最新评论

发表评论