以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (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=87363)


--  作者:Alisayue
--  发布时间:10/29/2010 7:00:00 PM

--  急问图片作为属性问题?
<?xml version="1.0" encoding="UTF-8"?>  
<!ELEMENT 图书 (名称,图片)>  
<!ELEMENT 名称 (#PCDATA)>  
<!ELEMENT 图片 (#PCDATA)>  

<?xml version="1.0" encoding="GB2312"?>  
<!DOCTYPE 图书 SYSTEM "a.dtd">  
<?xml:stylesheet href="Example8.xsl" type="text/xsl" ?>  
<图书>  
  <名称>XML实践教程</名称>  
  <图片>pic1.jpg</图片>  
</图书>  


<?xml version="1.0" encoding="gb2312"?>  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform version="1.  
0">  
<xsl:template match="/">  
  <html><body>  
  <xsl:value-of select="图书/名称"/>  
  <xsl:element name="IMG">  
  <xsl:attribute name="src">  
  <xsl:value-of select="图书/图片"/>   
  </xsl:attribute>  
  </xsl:element>  
  </body>  
  </html>  
</xsl:template>  
</xsl:stylesheet>  
这样是可以正常通过的。但是若把a.dtd文件和example8.xml改成如下就不能实现了,但  
是我又想把图片  

作为属性,这应该怎么办?  

<?xml version="1.0" encoding="UTF-8"?>  
<!ELEMENT 图书 (名称)>  
<!ELEMENT 名称 (#PCDATA)>  
<!NOTATION JPEG SYSTEM "iexplore.exe">  
<!ENTITY pic1 SYSTEM "pic1.jpg" NDATA JPEG>  
<!ATTLIST 名称 图片 ENTITY #REQUIRED>  

<?xml version="1.0" encoding="GB2312"?>  
<!DOCTYPE 图书 SYSTEM "a.dtd">  
<?xml:stylesheet href="Example8.xsl" type="text/xsl" ?>  
<图书>  
  <名称 图片="pic1">XML实践教程</名称>  
</图书>  

<?xml version="1.0" encoding="gb2312"?>  
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform version="1.  
0">  
<xsl:template match="/">  
  <html><body>  
  <xsl:value-of select="图书/名称"/>  
  <xsl:element name="img">  
  <xsl:attribute name="src">  
  <xsl:value-of select="图书/名称/@图片"/>  
  </xsl:attribute>  
  </xsl:element>  
  </body>  
  </html>  
</xsl:template>  
</xsl:stylesheet>  
后来发现把这句话 <xsl:value-of select="图书/名称/@图片"/>改成<xsl:value-of   
select="图书/名称/@图片"/>.jpg,就可以显示图片(看来XSL文件就根本没有去看  
DTD),但是这样我觉得不现实,万一图片将来各种格式都有怎么办?还有就是图片的名称和实体的名字不一致,这样直接加后缀名也不现实。  


--  作者:Qr
--  发布时间:10/30/2010 1:18:00 PM

--  
按你的需求,是不是所有的图片都要在DTD中声明?倒不如在XML中直接写明图片的后缀来得简单,还省去了维护DTD的麻烦。
--  作者:Alisayue
--  发布时间:11/3/2010 4:25:00 PM

--  
嗯,非常有道理。本来这样定义成实体,就想学学ENTITY类型的用法呢,结果反而给自己找了麻烦。
--  作者:dolphinyuan
--  发布时间:11/8/2010 8:05:00 AM

--  
你的实体的使用方法错了。不能这样引用:<名称 图片="pic1">XML实践教程</名称>,这样,pic1只是一个简单文本。应该像这样用:<名称 图片="&pic1;">XML实践教程</名称>,试试吧,呵呵。


--  作者:Alisayue
--  发布时间:11/8/2010 9:02:00 AM

--  
4楼的错误,pic1是个未解析实体,不能这样&pic1;引用的。注意看我的实体定义。
--  作者:dolphinyuan
--  发布时间:11/8/2010 1:28:00 PM

--  
哦,呵呵,不好意思,没有仔细看.那你可以在xsl里调用返回未解析的实体的URI的函数unparsed-entity-uri()呀.具体方法为:
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="/">  
  <html><body>  
  <xsl:value-of select="图书/名称"/>  
  <xsl:element name="img">  
  <xsl:attribute name="src">  
  <xsl:value-of select="unparsed-entity-uri('pic1')" />  
  </xsl:attribute>  
  </xsl:element>  
  </body>  
  </html>  
</xsl:template>  
</xsl:stylesheet>


另外请注意你的各个文档编码不一致.


--  作者:jj_long
--  发布时间:12/11/2010 9:20:00 PM

--  
楼上的方法是正确的。

这种情况下你需要使用unparsed-entity-uri()函数。这个函数的作用是找到实体(Entity)引用的具体文件。在你例子数据中,你引用了pic1实体:
<名称 图片="pic1">XML实践教程</名称>  

那么这个函数会找出pic1所引用的具体文件。它是去查你的entity定义而得到结果的:
<!ENTITY pic1 SYSTEM "pic1.jpg" NDATA JPEG>  


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