xslt не работает: шаблон не соответствует - PullRequest
3 голосов
/ 24 апреля 2010

Я пытаюсь запросить 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 не работает. Что не так с Пакетом / Участниками / Участником ? Что мне здесь не хватает? Есть ли что-то в пространствах имен, которые я не получаю?

Большое спасибо!

Ответы [ 3 ]

10 голосов
/ 24 апреля 2010

В вашем коде есть ряд проблем :

  1. Элементы документа XML находятся в пространстве имен по умолчанию, но шаблоны соответствия (и выражения выбора) в коде XSLT используют элементы в "пространстве имен".

  2. Две инструкции <xsl:value-of> пытаются получить значения 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>

Обратите внимание на новое определенное пространство имен с префиксом 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> s не будут пустыми.

0 голосов
/ 24 апреля 2010

Dimitre и bkail указали на проблемы в вашем XSLT, а также на то, что элементы <ParticipantType> и <Description> пусты.

Но мне интересно, возможно, вы хотели получить не (пустое) значение элемента <ParticipantType>, а вместо его атрибута Type (например, "RESOURCE" и "ROLE"). В этом случае вам потребуется изменить шаблон соответствия, чтобы указать атрибут:

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

Поскольку элементы <Description> в вашем образце не имеют ни содержимого элемента, ни каких-либо атрибутов, ничто не может быть извлечено из источника для отображения в файле результатов. Но имейте в виду, что «контент» - это конкретная ссылка на текст между начальным и конечным тегами элемента, и иногда вы хотите включить значение для одного из атрибутов элемента, а не «контент».

Roger_S

0 голосов
/ 24 апреля 2010

Ваш 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>
...