2010-04-24 98 views
3

我尝试使用下面的XSLT查询XML文件:XSLT破:模式不匹配

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
       xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
       xmlns:bpmn="http://dkm.fbk.eu/index.php/BPMN_Ontology"> 

<!-- Participants --> 
<xsl:template match="/"> 
<html> 
    <body> 
<table> 
      <xsl:for-each select="Package/Participants/Participant"> 
        <tr> 
        <td><xsl:value-of select="ParticipantType" /></td> 
        <td><xsl:value-of select="Description" /></td> 
        </tr> 
      </xsl:for-each> 
    </table> 
     </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

下面是XML文件的内容:

<?xml version="1.0" encoding="utf-8"?> 
    <?xml-stylesheet type="text/xsl" href="xpdl2bpmn.xsl"?> 
     <Package xmlns="http://www.wfmc.org/2008/XPDL2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Id="25ffcb89-a9bf-40bc-8f50-e5afe58abda0" Name="1 price setting" OnlyOneProcess="false"> 
     <PackageHeader> 
     <XPDLVersion>2.1</XPDLVersion> 
     <Vendor>BizAgi Process Modeler.</Vendor> 
     <Created>2010-04-24T10:49:45.3442528+02:00</Created> 
     <Description>1 price setting</Description> 
     <Documentation /> 
     </PackageHeader> 
     <RedefinableHeader> 
     <Author /> 
     <Version /> 
     <Countrykey>CO</Countrykey> 
     </RedefinableHeader> 
     <ExternalPackages /> 
     <Participants> 
     <Participant Id="008af9a6-fdc0-45e6-af3f-984c3e220e03" Name="customer"> 
      <ParticipantType Type="RESOURCE" /> 
      <Description /> 
     </Participant> 
     <Participant Id="1d2fd8b4-eb88-479b-9c1d-7fe6c45b910e" Name="clerk"> 
      <ParticipantType Type="ROLE" /> 
      <Description /> 
     </Participant> 
     </Participants> 
</Package> 

尽管如此,简单的模式,该foreach不起作用。有什么问题套餐/参与者/参与者?我在这里错过什么?有没有关于命名空间的东西,我没有得到?

非常感谢!

+0

问得好(+1)。查看我的答案,获取描述代码中两个问题的完整解决方案,并演示如何解决这些问题。 :) – 2010-04-24 16:19:52

回答

10

有在你的代码了一些问题:

  1. XML文档的元素是一个默认的命名空间,但比赛XSLT代码中的模式(和选择表达式)使用“无名称空间”中的元素。

  2. 这两个<xsl:value-of>指令试图产生值ParticipantTypeDescription,但这两个元素没有任何价值。

第二个问题需要的XML文档进行更改,以便ParticipantTypeDescription具有值。

的第一个问题是许多常见的主题,有一个众所周知的解决方案:这是默认的XML文档中的命名空间 - 也必须定义并与XSLT样式表中的前缀相关联。从XML文档引用名称时必须使用此前缀。

这种修正后的XSLT样式表将如下所示:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
xmlns:bpmn="http://dkm.fbk.eu/index.php/BPMN_Ontology" 
xmlns:xp="http://www.wfmc.org/2008/XPDL2.1" 
> 

<!-- Participants --> 
<xsl:template match="/"> 
<html> 
<body> 
    <table> 
    <xsl:for-each select="xp:Package/xp:Participants/xp:Participant"> 
    <tr> 
     <td><xsl:value-of select="xp:ParticipantType" /></td> 
     <td><xsl:value-of select="xp:Description" /></td> 
    </tr> 
    </xsl:for-each> 
    </table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

注意新定义的命名空间与xp:前缀。

输出现在是

<html xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:bpmn="http://dkm.fbk.eu/index.php/BPMN_Ontology" xmlns:xp="http://www.wfmc.org/2008/XPDL2.1"> 
    <body> 
     <table> 
      <tr> 
       <td></td> 
       <td></td> 
      </tr> 
      <tr> 
       <td></td> 
       <td></td> 
      </tr> 
     </table> 
    </body> 
</html> 

你只需要解决问题1<td>旨意不能为空。

+0

+1涵盖了这两个问题。 – 2010-04-24 16:19:21

+0

BRILLIANT !!我一直在努力理解命名空间几年,并且一直在欺骗XSLT来生成匹配和选择EVERYNODE的HTML电子邮件; match =“* [name()='TagName']” 这个例子刚刚做了一分钱! – 2012-02-10 17:43:21

+0

@威尔汉科克:不客气。 – 2012-02-10 19:04:14

0

您的XML文件具有默认名称空间。你需要明确匹配,在您的XSLT:

<xsl:for-each 
    xmlns:xpdl2="http://www.wfmc.org/2008/XPDL2.1" 
    select="xpdl2:Package/xpdl2:Participants/xpdl2:Participant"> 
     <tr> 
      <td><xsl:value-of select="xpdl2:ParticipantType" /></td> 
      <td><xsl:value-of select="xpdl2:Description" /></td> 
     </tr> 
</xsl:for-each> 
0

Dimitre和bkail指出了您的XSLT中的问题,并指出<ParticipantType><Description>元素为空。

但是我想知道你是否想要得到<ParticipantType>元素的(空)值,而不是它的Type属性(例如“RESOURCE”和“ROLE”)。在这种情况下,你需要改变你的比赛模式,以指定属性:

<td><xsl:value-of select="xp:ParticipantType/@Type" /></td 

因为你的样品中<Description>元素既没有元素含量也没有任何属性,有什么可以被人拔光了源来出现在结果文件中。但请注意,“内容”是元素的开始标签和结束标签之间的文本的特定引用,有时您希望包含该元素的某个属性的值,而不是“内容”。

Roger_S