xslt - 使用 XSL 呈现 RDF。更新

标签 xslt rdf rdfs

我编写了 RDF 文件,并被要求使用 XSL 呈现它。

RDF 代码(已更改)

    <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="XSLTFile1.xslt"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:clinic="http://www.computing-services.co.il"
xml:base="http://www.computing-services.co.il">
<rdfs:Class rdf:ID="Patient">
<rdfs:comment>
the class of patient
</rdfs:comment>
</rdfs:Class>
<rdf:Property rdf:ID="ID">
<rdfs:comment>
Patient's ID
</rdfs:comment>
<rdfs:domain rdf:resource="#Patient"/>
<rdfs:range rdf:resource="http://www.w3.org/2000/01/rdf-schema#Literal"/>
</rdf:Property>
<rdf:Property rdf:ID="Name">
<rdfs:comment>
Patient's Name
</rdfs:comment>
<rdfs:domain rdf:resource="#Patient"/>
<rdfs:range rdf:resource="http://www.w3.org/2000/01/rdf-schema#Literal"/>
</rdf:Property>
  <rdf:Property rdf:ID="Age">
    <rdfs:comment>
      Patient's Age
    </rdfs:comment>
    <rdfs:domain rdf:resource="#Patient"/>
    <rdfs:range rdf:resource="http://www.w3.org/2000/01/rdf-schema#Literal"/>
  </rdf:Property>
  <rdf:Property rdf:ID="Sex">
    <rdfs:comment>
      Patient's Sex
    </rdfs:comment>
    <rdfs:domain rdf:resource="#Patient"/>
    <rdfs:range rdf:resource="http://www.w3.org/2000/01/rdf-schema#Literal"/>
  </rdf:Property>
<rdfs:Class rdf:ID="Disease">
<rdfs:comment>
the class of diseases
</rdfs:comment>
</rdfs:Class>
  <rdfs:Class rdf:ID="CancDiseases">
    <rdfs:comment>
      the class of cancerous diseases
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#Disease"/>
  </rdfs:Class>
  <rdfs:Class rdf:ID="CntDiseases">
    <rdfs:comment>
      the class of contagious diseases
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#Disease"/>
  </rdfs:Class>
  <rdfs:Class rdf:ID="Traumas">
    <rdfs:comment>
      the class of traumas
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#Disease"/>
  </rdfs:Class>
  <rdfs:Class rdf:ID="IntDiseases">
    <rdfs:comment>
      the class of Internal diseases
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#Disease"/>
  </rdfs:Class>
  <rdfs:Class rdf:ID="EmIntDiseases">
    <rdfs:comment>
      the class of Emerging diseases
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#IntDiseases"/>
  </rdfs:Class>
  <rdfs:Class rdf:ID="ChIntDiseases">
    <rdfs:comment>
      the class of Chronic diseases
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#IntDiseases"/>
  </rdfs:Class>
  <rdfs:Class rdf:ID="Treatment">
    <rdfs:comment>
      the class of treatment
    </rdfs:comment>
  </rdfs:Class>
  <rdfs:Class rdf:ID="Medication">
    <rdfs:comment>
      the class of medications
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#Treatment"/>
  </rdfs:Class>
  <rdfs:Class rdf:ID="Procedure">
    <rdfs:comment>
      the class of procedures
    </rdfs:comment>
    <rdfs:subClassOf rdf:resource="#Treatment"/>
  </rdfs:Class>


<rdf:Property rdf:ID="isSick">
<rdfs:domain rdf:resource="#Patient"/>
<rdfs:range rdf:resource="#Disease"/>
</rdf:Property>
  <rdf:Property rdf:ID="gets">
    <rdfs:domain rdf:resource="#Patient"/>
    <rdfs:range rdf:resource="#Treatment"/>
  </rdf:Property>
  <rdf:Property rdf:ID="helpsFrom">
    <rdfs:domain rdf:resource="#Treatment"/>
    <rdfs:range rdf:resource="#Disease"/>
  </rdf:Property>







          <clinic:ChIntDiseases rdf:ID="chrone"/>
          <clinic:ChIntDiseases rdf:ID="diabetes"/>
          <clinic:Traumas rdf:ID="BrokenLeg"/>
          <clinic:EmIntDiseases rdf:ID="Appendicite"/>
          <clinic:CancDiseases rdf:ID="BreastCancer"/>
          <clinic:CancDiseases rdf:ID="LungCancer"/>






  <clinic:Medication rdf:ID="Insuline">
    <clinic:helpsFrom rdf:resource="#diabetes"/>
  </clinic:Medication>
  <clinic:Medication rdf:ID="Pentassa">
    <clinic:helpsFrom rdf:resource="#chrone"/>
  </clinic:Medication>
  <clinic:Medication rdf:ID="Raffasal">
    <clinic:helpsFrom rdf:resource="#chrone"/>
  </clinic:Medication>
  <clinic:Medication rdf:ID="Advil">
    <clinic:helpsFrom rdf:resource="#BrokenLeg"/>
    <clinic:helpsFrom rdf:resource="#Appendicite"/>
  </clinic:Medication>
  <clinic:Procedure rdf:ID="Sigmoscopia">
    <clinic:helpsFrom rdf:resource="#chrone"/>
  </clinic:Procedure>
  <clinic:Procedure rdf:ID="Chemo">
    <clinic:helpsFrom rdf:resource="#BreastCancer"/>
    <clinic:helpsFrom rdf:resource="#LungCancer"/>
  </clinic:Procedure>



          <clinic:Patient rdf:ID="p23456">
            <clinic:Name>Linda Jones</clinic:Name>
            <clinic:Sex>Female</clinic:Sex>
            <clinic:Age>56</clinic:Age>
            <clinic:isSic>
              <rdf:Bag>
                <rdf:li rdf:resource="#chrone"/>
                <rdf:li rdf:resource="#diabetes"/>
              </rdf:Bag>
            </clinic:isSic>
            <clinic:gets>
              <rdf:Bag>
                <rdf:li rdf:resource="#Pentassa"/>
                <rdf:li rdf:resource="#Insuline"/>
              </rdf:Bag>
            </clinic:gets>
          </clinic:Patient>
  <clinic:Patient rdf:ID="p12345">
    <clinic:Name>Moshe Koen</clinic:Name>
    <clinic:Sex>Male</clinic:Sex>
    <clinic:Age>70</clinic:Age>
    <clinic:isSic>
      <rdf:Bag>
        <rdf:li rdf:resource="#diabetes"/>
      </rdf:Bag>
    </clinic:isSic>
    <clinic:gets>
      <rdf:Bag>
        <rdf:li rdf:resource="#Insuline"/>
      </rdf:Bag>
    </clinic:gets>
  </clinic:Patient>
  <clinic:Patient rdf:ID="p34567">
    <clinic:Name>Ofer Meleh</clinic:Name>
    <clinic:Sex>Male</clinic:Sex>
    <clinic:Age>25</clinic:Age>
    <clinic:isSic>
      <rdf:Bag>
        <rdf:li rdf:resource="#BrokenLeg"/>
      </rdf:Bag>
    </clinic:isSic>
    <clinic:gets>
      <rdf:Bag>
        <rdf:li rdf:resource="#Advil"/>
      </rdf:Bag>
    </clinic:gets>
  </clinic:Patient>
  <clinic:Patient rdf:ID="p45678">
    <clinic:Name>Itzhak Rabinovich</clinic:Name>
    <clinic:Sex>Male</clinic:Sex>
    <clinic:Age>38</clinic:Age>
    <clinic:isSic>
      <rdf:Bag>
        <rdf:li rdf:resource="#LungCancer"/>
      </rdf:Bag>
    </clinic:isSic>
    <clinic:gets>
      <rdf:Bag>
        <rdf:li rdf:resource="#Chemo"/>
      </rdf:Bag>
    </clinic:gets>
  </clinic:Patient>
  <clinic:Patient rdf:ID="p56789">
    <clinic:Name>Golda Zilber</clinic:Name>
    <clinic:Sex>Female</clinic:Sex>
    <clinic:Age>45</clinic:Age>
    <clinic:isSic>
      <rdf:Bag>
        <rdf:li rdf:resource="#BreastCancer"/>
        <rdf:li rdf:resource="#Appendicite"/>
      </rdf:Bag>
    </clinic:isSic>
    <clinic:gets>
      <rdf:Bag>
        <rdf:li rdf:resource="#Chemo"/>
        <rdf:li rdf:resource="#Advil"/>
      </rdf:Bag>
    </clinic:gets>
  </clinic:Patient>




</rdf:RDF>

`

有患者,有他们的疾病和治疗方法(我更改了之前的 RDFS 部分)
我需要制作有序的患者列表(带有他们的个人数据)和每个患者 - 他的疾病和治疗表。

它应该是这样的:



这是我写 xsl 的新尝试
        <?xml version="1.0"?>
<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:clinic="http://www.infomed.co.il">
  <xsl:output method="html" indent="yes"/>

  <xsl:template match="/rdf:RDF/clinic:Patient">
    <html>
      <body>
        <ol>
          <xsl:apply-templates select="/rdf:RDF/clinic:Patient" />
        </ol>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="clinic:Patient">
    <li>
      Name <xsl:value-of select="clinic:Name"/>
      Age <xsl:value-of select="clinic:Age"/>
      Sex <xsl:value-of select="clinic:Sex"/>
      <table>
        <tr>
          <th>Disease</th>
          <xsl:apply-templates select="clinic:isSic" />
          <th>Treatment</th>
          <xsl:apply-templates select="clinic:gets" />
        </tr>


      </table>
    </li>
  </xsl:template>

  <xsl:template match="clinic:isSic">
    <xsl:variable name="resource" select="@rdf:resource"/>
      <td>
        <xsl:value-of select="translate(@rdf:resource,'#','')"/>
      </td>  
  </xsl:template>
  <xsl:template match="clinic:gets">
    <xsl:variable name="resource" select="@rdf:resource"/>
    <td>
      <xsl:value-of select="translate(@rdf:resource,'#','')"/>
    </td>
  </xsl:template>


</xsl:stylesheet>

它仍然不起作用,但至少我现在看到了患者数据。它看起来像这样:

患者类别 患者 ID 患者姓名 患者年龄 患者性别 疾病类别 癌症类别 传染病类别 外伤类别 内科疾病类别 新发疾病类别 慢性疾病类别 治疗类别药物类别 程序类别 Linda Jones 女性 56 Moshe Koen 男性 70 Ofer Meleh 男性 25 Itzhak Rabinovich 男性 38 Golda Zilber 女性 45

我会很感激任何帮助使它像这样:

最佳答案

更新答案以反射(reflect)问题的变化:

您更新后的样式表仍然存在一些问题:

  • clinic 的命名空间在 XSLT 中使用不正确的命名空间 uri 声明。需要映射到http://www.computing-services.co.il以便您的 XPath 语句匹配。
  • 我更改了在 /rdf:RDF/clinic:Patient 上匹配的模板在根节点上匹配 /以确保控制样式表的处理方式。否则,默认模板将在元素和文本节点(发出文本和空格)上匹配,直到遇到 clinic:Patent元素并执行模板。
  • 如果您想要疾病和治疗的单独行,那么您需要关闭 tr并在 <tr>Treatment</tr> 之前开始一个新的.
  • clinic:isSic 的模板中和 clinic:gets ,您不需要资源变量和@rdf:Resource is 的路径rdf:Bag/rdf:li/@rdf:resource`。

  • 我对您的样式表进行了这些调整:
    <?xml version="1.0"?>
    <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:clinic="http://www.computing-services.co.il">
      <xsl:output method="html" indent="yes"/>
    
      <xsl:template match="/">
        <html>
          <body>
            <ol>
              <xsl:apply-templates select="/rdf:RDF/clinic:Patient" />
            </ol>
          </body>
        </html>
      </xsl:template>
    
      <xsl:template match="clinic:Patient">
        <li>
          Name <xsl:value-of select="clinic:Name"/>
          Age <xsl:value-of select="clinic:Age"/>
          Sex <xsl:value-of select="clinic:Sex"/>
          <table border="1">
            <tr>
              <th>Disease</th>
              <xsl:apply-templates select="clinic:isSic" />
            </tr>
            <tr>
              <th>Treatment</th>
              <xsl:apply-templates select="clinic:gets" />
            </tr>
          </table>
        </li>
      </xsl:template>
    
      <xsl:template match="clinic:isSic">
          <xsl:apply-templates select="rdf:Bag/rdf:li/@rdf:resource"/>
      </xsl:template>
    
      <xsl:template match="clinic:gets"> 
          <xsl:apply-templates select="rdf:Bag/rdf:li/@rdf:resource"/>
      </xsl:template>
    
      <xsl:template match="rdf:Bag/rdf:li/@rdf:resource">
        <td>
          <xsl:value-of select="translate(.,'#','')"/>
        </td>
      </xsl:template>
    </xsl:stylesheet>
    

    顺便说一句,当前的逻辑似乎假设存在疾病和治疗的一对一映射。如果有多种治疗,您将如何区分或知道哪些治疗对应于哪种疾病?

    关于xslt - 使用 XSL 呈现 RDF。更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167975/

    相关文章:

    rdf - SPARQL 查询中 OPTIONAL 关键字的替代方法?

    python - RDFlib 'on disk' 存储

    uml - 软件工程过程中OWL和UML有什么区别

    java - JENA RDF/XML 格式 rdfs 示例

    java - Jena- 在 xml dateTime 中存储日期- 意外行为

    java - 以下 xml 需要 xslt 输出

    xslt - 是否可以在 XSL 中匹配 "none"?

    xml - 格式化具有指定小数位数的 double 值

    sparql - 如何在 SPARQL 中指定蕴含机制?

    xslt - 如何知道变量在XSLT中是否有值(value)