xslt破坏:模式不匹配

时间:2010-04-24 15:47:33

标签: 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-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不起作用。 套餐/参与者/参与者有什么问题?我在这里想念什么?是否有关于命名空间的内容我不明白?

非常感谢!

3 个答案:

答案 0 :(得分:10)

您的代码中存在许多问题

  1. XML文档的元素位于默认命名空间中,但XSLT代码中的匹配模式(和选择表达式)使用“无命名空间”中的元素。

  2. 两条<xsl:value-of>指令尝试生成ParticipantTypeDescription的值,但这两个元素没有任何值。

  3. 第二个问题需要更改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>不会为空。

答案 1 :(得分: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>

答案 2 :(得分:0)

Dimitre和bkail指出了XSLT中的问题,以及<ParticipantType><Description>元素都是空的。

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

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

由于样本中的<Description>元素既没有元素内容也没有任何属性,因此没有任何内容可以从源中提取出来以显示在结果文件中。但请注意,“内容”是元素的开始和结束标记之间文本的特定引用,有时您希望包含元素属性之一的值,而不是“内容”。

Roger_S