commit 2ee1c410c05b1a9ca12b00bd84b0459bff9ba858
parent 72de1e8518c4de4d8e9d89f23dea0e325fe72b55
Author: Dan Callaghan <djc@djc.id.au>
Date: Wed, 25 Nov 2009 22:18:29 +1000
rdf:if negation
Diffstat:
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/src/main/java/au/com/miskinhill/rdftemplate/TemplateInterpolator.java b/src/main/java/au/com/miskinhill/rdftemplate/TemplateInterpolator.java
@@ -122,10 +122,20 @@ public class TemplateInterpolator {
StartElement start = (StartElement) event;
if (start.getName().equals(IF_ACTION_QNAME)) {
Attribute testAttribute = start.getAttributeByName(new QName("test"));
- if (testAttribute == null)
- throw new TemplateSyntaxException("rdf:if must have a test attribute");
- Selector<?> selector = selectorFactory.get(testAttribute.getValue());
- if (selector.result(node).isEmpty()) {
+ Attribute notAttribute = start.getAttributeByName(new QName("not"));
+ String condition;
+ boolean negate = false;
+ if (testAttribute != null && notAttribute != null)
+ throw new TemplateSyntaxException("test and not attribute on rdf:if are mutually exclusive");
+ else if (testAttribute != null)
+ condition = testAttribute.getValue();
+ else if (notAttribute != null) {
+ condition = notAttribute.getValue();
+ negate = true;
+ } else
+ throw new TemplateSyntaxException("rdf:if must have a test attribute or a not attribute");
+ List<?> selectorResult = selectorFactory.get(condition).result(node);
+ if (negate ? !selectorResult.isEmpty() : selectorResult.isEmpty()) {
consumeTree(start, reader);
break;
} else {
diff --git a/src/test/java/au/com/miskinhill/rdftemplate/TemplateInterpolatorUnitTest.java b/src/test/java/au/com/miskinhill/rdftemplate/TemplateInterpolatorUnitTest.java
@@ -64,12 +64,14 @@ public class TemplateInterpolatorUnitTest {
assertThat(result, containsString("attribute test"));
assertThat(result, containsString("element test"));
assertThat(result, not(containsString("rdf:if")));
+ assertThat(result, not(containsString("negated test")));
Resource authorWithoutNotes = model.getResource("http://miskinhill.com.au/authors/another-author");
result = templateInterpolator.interpolate(
new InputStreamReader(this.getClass().getResourceAsStream("conditional.xml")), authorWithoutNotes);
assertThat(result, not(containsString("attribute test")));
assertThat(result, not(containsString("element test")));
+ assertThat(result, containsString("negated test"));
}
@Test
diff --git a/src/test/resources/au/com/miskinhill/rdftemplate/conditional.xml b/src/test/resources/au/com/miskinhill/rdftemplate/conditional.xml
@@ -6,5 +6,7 @@
<rdf:if test="mhs:biographicalNotes">element test</rdf:if>
+<rdf:if not="mhs:biographicalNotes">negated test</rdf:if>
+
</body>
</html>
\ No newline at end of file