Skip to content

Commit

Permalink
Fix SWRL parsing
Browse files Browse the repository at this point in the history
Addes support for correct xslt transformation
for TOC and SWRL display. The transformation checks
if rdfs:label is defined if not the rules are generically
number as they appear in the XML serialization of the ontology.
  • Loading branch information
Victor Chavez committed Dec 12, 2023
1 parent 4da92b2 commit 8c9838d
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 7 deletions.
10 changes: 7 additions & 3 deletions src/main/java/widoco/CreateResources.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public static void generateDocumentation(String outFolder, Configuration c, File
if (c.isIncludeOverview()) {
overview = createOverviewSection(folderOut + File.separator + "sections", c, lode.getClassList(),
lode.getPropertyList(), lode.getDataPropList(), lode.getAnnotationPropList(),
lode.getNamedIndividualList(), lode.getRuleList(), languageFile);
lode.getNamedIndividualList(), lode.getRuleList(), lode.getSwrlruleslist(),languageFile);
}
if (c.isIncludeDescription()) {
description = createDescriptionSection(folderOut + File.separator + "sections", c, languageFile);
Expand Down Expand Up @@ -253,7 +253,7 @@ private static String createIntroductionSection(String path, Configuration c,Pro

// the lists passed onto this method are the fixed lists
private static String createOverviewSection(String path, Configuration c, String classesList, String propList,
String dataPropList, String annotationProps, String namedIndividuals, String rules, Properties lang) {
String dataPropList, String annotationProps, String namedIndividuals, String rules, String swrlruleslist, Properties lang) {
String textToWrite = "";
if ((c.getOverviewPath() != null) && (!"".equals(c.getOverviewPath()))) {
textToWrite = WidocoUtils.readExternalResource(c.getOverviewPath());
Expand Down Expand Up @@ -342,11 +342,15 @@ private static String createCrossReferenceSection(String path, LODEParser lodePa
if (includesNamedIndividual) {
textToWrite += lodeParser.getNamedIndividuals();
}
//since rules are an edge case, if they exist we add them
//since rules and swrl rules are an edge case, if they exist we add them
if(lodeParser.getRuleList()!=null && !lodeParser.getRuleList().isEmpty()){
textToWrite += lodeParser.getRules();
}

if(lodeParser.getSwrlruleslist()!=null && !lodeParser.getSwrlruleslist().isEmpty()){
textToWrite += lodeParser.getSwrlrules();
}

// Add legend (for ontology components actually used).
textToWrite += Constants.getLegend(lang, includesClass, includesProperty,
includesDatatypeProperty, includesAnnotation, includesNamedIndividual);
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/widoco/LODEParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Properties;
import java.util.Objects;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
Expand Down Expand Up @@ -65,6 +66,8 @@ public class LODEParser {
private String namedIndividualList;
private String rules;
private String ruleList;
private String swrlrules;
private String swrlruleslist;
Configuration c;

/**
Expand Down Expand Up @@ -133,6 +136,14 @@ public String getRuleList() {
return ruleList;
}

public String getSwrlrules() {
return swrlrules;
}

public String getSwrlruleslist() {
return swrlruleslist;
}

private void parse(String content, Properties langFile) {

try {
Expand Down Expand Up @@ -191,6 +202,12 @@ private void parse(String content, Properties langFile) {
// "<h3 id=\"rules\" class=\"list\">"
// + langFile.getProperty(Constants.LANG_NAMED_INDIV) + "</h3>");
break;
case "swrlrules":
swrlruleslist = (getTermList(html.item(i)));
swrlrules = (nodeToString(html.item(i)));
swrlrules = swrlrules.replace("<h2>SWRL rules</h2>",
"<h3 id=\"namedindividuals\" class=\"list\">SWRL rules</h3>");
break;
}
}
// fix ids
Expand Down Expand Up @@ -263,6 +280,12 @@ private String nodeToString(Node n) {
// (the second one)
private Node fixAnchor(Node nodeToFix) {
try {
String AttrID = nodeToFix.getAttributes().item(0).getTextContent();
// Do nothing for swrl rules, they do not have
// <a> and <h3>
if (Objects.equals(AttrID, "swrlrules")) {
return nodeToFix;
}
NodeList outerDiv = nodeToFix.getChildNodes();
for (int i = 0; i < outerDiv.getLength(); i++) {
Node currentNode = outerDiv.item(i);
Expand Down
Binary file modified src/main/resources/lode.zip
Binary file not shown.
2 changes: 1 addition & 1 deletion src/main/resources/lode/extraction.xsl
Original file line number Diff line number Diff line change
Expand Up @@ -1723,7 +1723,7 @@ http://www.oxygenxml.com/ns/doc/xsl ">
<xsl:if test="exists(/rdf:RDF/(swrl:Imp | rdf:Description[rdf:type[@*:resource = 'http://www.w3.org/2003/11/swrl#Imp']]))">
<li>
<a href="#swrlrules">
<xsl:value-of select="f:getDescriptionLabel('rules')"/>
<xsl:value-of select="f:getDescriptionLabel('swrlrules')"/>
</a>
</li>
</xsl:if>
Expand Down
50 changes: 47 additions & 3 deletions src/main/resources/lode/swrl-module.xsl
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,61 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
xmlns:f="http://www.essepuntato.it/xslt/function"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns="http://www.w3.org/1999/xhtml">



<xsl:template match="rdf:Description" mode="toc">
<li>
<a href="#{generate-id()}">
<xsl:choose>
<xsl:when test="string(rdfs:label)">
<xsl:value-of select="rdfs:label"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>Rule #</xsl:text>
<xsl:value-of select="count(preceding-sibling::rdf:Description[rdf:type[@rdf:resource = 'http://www.w3.org/2003/11/swrl#Imp']]) + 1"/>
</xsl:otherwise>
</xsl:choose>
</a>
</li>
</xsl:template>

<!-- SWRL TOC and SWRL Rule extraction
Copyright (C) 2023, Victor Chavez <[email protected]>
-->
<xsl:template name="get.swrl.toc">
<ul class="hlist">
<xsl:apply-templates select="/rdf:RDF/rdf:Description[rdf:type[@rdf:resource='http://www.w3.org/2003/11/swrl#Imp']]" mode="toc">
<xsl:sort select="rdfs:comment" order="ascending" data-type="text"/>
</xsl:apply-templates>
</ul>
</xsl:template>

<xsl:template match="swrl:Imp | rdf:Description[rdf:type[@rdf:resource = 'http://www.w3.org/2003/11/swrl#Imp']]">
<div id="{generate-id()}" class="entity">
<h3>Rule #<xsl:value-of select="count(preceding-sibling::swrl:Imp | preceding-sibling::rdf:Description[rdf:type[@rdf:resource = 'http://www.w3.org/2003/11/swrl#Imp']]) + 1" /> <xsl:call-template name="get.backlink.to.top" /></h3>
<h3>
<xsl:choose>
<xsl:when test="string(rdfs:label)">
<xsl:value-of select="rdfs:label"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat('Rule #', count(preceding-sibling::swrl:Imp | preceding-sibling::rdf:Description[rdf:type[@rdf:resource = 'http://www.w3.org/2003/11/swrl#Imp']]) + 1)"/>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="get.backlink.to.top" />
</h3>
<p>
<!-- Add rdfs:comment -->
<xsl:if test="rdfs:comment">
<xsl:value-of select="rdfs:comment" /><br/><br/>
</xsl:if>
<!-- Continue with the existing content -->
<xsl:apply-templates select="swrl:body" />
<xsl:text> -> </xsl:text>
<xsl:apply-templates select="swrl:head" />
</p>
</div>
</xsl:template>

<xsl:template match="swrl:body | swrl:head | swrl:AtomList/rdf:first | rdf:Description[rdf:type[@rdf:resource = 'http://www.w3.org/2003/11/swrl#AtomList']]/rdf:first">
<xsl:apply-templates />
</xsl:template>
Expand Down Expand Up @@ -140,6 +183,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
<xsl:if test="exists(//(swrl:Imp | rdf:Description[rdf:type[@rdf:resource = 'http://www.w3.org/2003/11/swrl#Imp']]))">
<div id="swrlrules">
<h2>SWRL rules</h2>
<xsl:call-template name="get.swrl.toc"/>
<xsl:apply-templates select="//(swrl:Imp | rdf:Description[rdf:type[@rdf:resource = 'http://www.w3.org/2003/11/swrl#Imp']])" />
</div>
</xsl:if>
Expand Down

0 comments on commit 8c9838d

Please sign in to comment.