我编写了 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/