Xml xslt已损坏:模式不匹配
我正在尝试使用以下xslt查询xml文件:Xml xslt已损坏:模式不匹配,xml,xslt,foreach,pattern-matching,Xml,Xslt,Foreach,Pattern Matching,我正在尝试使用以下xslt查询xml文件: <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-
<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不起作用。套餐/参与者/参与者有什么问题?我错过了什么?关于名称空间有什么我不知道的吗
非常感谢 您的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>
您的代码中存在许多问题:
XML文档的元素位于默认名称空间中,但XSLT代码中的匹配模式和select表达式不使用名称空间中的元素
这两条指令试图产生ParticipantType和Description的值,但这两个元素没有任何值
第二个问题需要更改XML文档,以便ParticipantType和Description具有值
第一个问题是许多常见问题解答的主题,并且有一个众所周知的解决方案: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>
您只需要解决问题1,s就不会是空的。Dimitre和bkail指出了XSLT中的问题,并且and元素是空的 但是我想知道你是否不是想得到元素的空值,而是想得到它的Type属性,比如RESOURCE和ROLE。在这种情况下,您需要更改匹配模式以指定属性:
<td><xsl:value-of select="xp:ParticipantType/@Type" /></td
由于示例中的元素既没有元素内容也没有任何属性,因此无法从源中提取任何内容以显示在结果文件中。但是请注意,内容是对元素的开始标记和结束标记之间的文本的特定引用,有时您希望包含元素属性之一的值,而不是内容
罗杰斯好问题+1。请参阅我的答案,以获得完整的解决方案,该解决方案描述了代码中的两个问题,并说明了如何解决它们:明亮的几年来,我一直在努力理解名称空间,并且一直在捏造XSLT来生成匹配和选择EVERYNODE的HTML电子邮件;match=*[name='TagName'],而这个例子刚刚让你赚了一分钱@用户1244215,你和这个问题有什么关系?这个名称空间是OP在原始问题中提供的XML文档和代码的一部分。
<td><xsl:value-of select="xp:ParticipantType/@Type" /></td