<xsl:output indent="yes" method="xml" version="1.0" encoding="UTF-8"/>
<!--
-./yaz-xmlquery -p '@and @attr 1=1016 @attr 4=2 @attr 6=3 the @attr 1=4 fish' > test.xml && xsltproc identity.xsl test.xml && ./yaz-xmlquery -x test1.xml && xsltproc pqf2pqf.xsl test.xml |tee test2.xml && ./yaz-xmlquery -x test2.xml
+./yaz-xmlquery -p '@and @attr 1=1016 @attr 4=2 @attr 6=3 the @attr 1=4 fish' > test.xml && xmllint -format test.xml && ./yaz-xmlquery -x test1.xml && xsltproc pqf2pqf.xsl test.xml |tee test2.xml && ./yaz-xmlquery -x test2.xml
-./yaz-xmlquery -p '@not @attr 1=1016 @attr 4=2 @attr 6=3 @attr 7=1 @attr 8=4 fish @attr 1=4 fish' > test.xml && xsltproc identity.xsl test.xml && ./yaz-xmlquery -x test.xml && xsltproc pqf2pqf.xsl test.xml |tee test2.xml && ./yaz-xmlquery -x test2.xml
+./yaz-xmlquery -p '@not @attr 1=1016 @attr 4=2 @attr 6=3 @attr 7=1 @attr 8=4 fish @attr 1=4 fish' > test.xml && xmllint -format test.xml && ./yaz-xmlquery -x test.xml && xsltproc pqf2pqf.xsl test.xml |tee test2.xml && ./yaz-xmlquery -x test2.xml
-->
<!-- disable default templates -->
<xsl:template match="node()"/>
<!-- identity stylesheet templates -->
+ <!-- these parse pqf-xml input recursively and make identity operations -->
<xsl:template match="/query">
<query>
<xsl:apply-templates/>
</rpn>
</xsl:template>
+ <xsl:template match="operator">
+ <operator>
+ <xsl:attribute name="type">
+ <xsl:value-of select="@type"/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </operator>
+ </xsl:template>
<xsl:template match="apt">
<apt>
- <xsl:apply-templates select="attr"/>
- <xsl:apply-templates select="term"/>
- <!-- re-ordering @attr's if you use the following -->
+ <!-- no re-ordering @attr's if you use the following -->
<!--
+ <xsl:apply-templates select="attr"/>
+ -->
<xsl:apply-templates select="attr[@type=1]"/>
<xsl:apply-templates select="attr[@type=2]"/>
<xsl:apply-templates select="attr[@type=4]"/>
<xsl:apply-templates select="attr[@type=8]"/>
<xsl:apply-templates select="attr[@type=9]"/>
<xsl:apply-templates select="term"/>
- -->
</apt>
</xsl:template>
- <xsl:template match="operator">
- <operator>
- <xsl:attribute name="type">
- <xsl:value-of select="@type"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </operator>
- </xsl:template>
-
<xsl:template match="attr">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:template>
- <!-- special rewrite templates -->
+ <!-- special rewrite templates
+ these are kicking in when special conditions apply -->
+
<!-- attribute rewrites -->
<!-- remove all @attr 6=3 with bracket syntax -->
+ <!--
<xsl:template match="attr[@type=6][@value=3]">
</xsl:template>
+ -->
<!-- remove all @attr 6=4 with and syntax -->
+ <!--
<xsl:template match="attr[@type=6 and @value=4]">
</xsl:template>
+ -->
<!-- rewrite all @attr 4=2 to @attr 4=1 -->
+ <!--
<xsl:template match="attr[@type=4][@value=2]">
<attr type="4" value="1"/>
</xsl:template>
+ -->
<!-- rewrite all @attr 1=1016 to @attr 1=1016 @attr 6=2 -->
+ <!-- this will leave double @attr 6=? nodes, unless you remove all
+ @attr 6=? nodes in some other template -->
+ <!--
<xsl:template match="attr[@type=1 and @value=1016]">
<attr type="1" value="1016"/>
<attr type="6" value="2"/>
</xsl:template>
+ -->
+ <!-- rules depending on multiple attribute combinations -->
+
+ <!-- whenever there is a <apt> containing an @attr 7 and an @attr 8,
+ rewrite these and drop all @attr 3 .
+ Notice that the selection rules can equally either be written
+ 'attr/@type=7' or 'attr[@type=8]' with no difference -->
+ <!--
+ <xsl:template match="apt[attr/@type=7 and attr[@type=8]]">
+ <apt>
+ <xsl:apply-templates select="attr[@type=1]"/>
+ <xsl:apply-templates select="attr[@type=2]"/>
+ <xsl:apply-templates select="attr[@type=4]"/>
+ <xsl:apply-templates select="attr[@type=5]"/>
+ <xsl:apply-templates select="attr[@type=6]"/>
+ <attr type="7" value="2"/>
+ <attr type="8" value="5"/>
+ <xsl:apply-templates select="attr[@type=9]"/>
+ <xsl:apply-templates select="term"/>
+ </apt>
+ </xsl:template>
+ -->
+
+ <!-- whenever there is an apt containing an @attr 7=1, an @attr 8=4, and
+ an @attr 1=? (of any value), let @attr 1=? pass unaltered, drop
+ @attr 3=? totally, and rewrite @attr 7=1 and @attr 8=4 .
+ Notice that this rule can equally be written either with 'and'
+ connecting the attribute type and value, or with a double '[]'.-->
+ <!--
+ <xsl:template match="apt[attr[@type=7 and @value=1]
+ and attr[@type=8][@value=4]
+ and attr[@type=1]] ">
+ <apt>
+ <xsl:apply-templates select="attr[@type=1]"/>
+ <xsl:apply-templates select="attr[@type=2]"/>
+ <xsl:apply-templates select="attr[@type=4]"/>
+ <xsl:apply-templates select="attr[@type=5]"/>
+ <xsl:apply-templates select="attr[@type=6]"/>
+ <attr type="7" value="2"/>
+ <attr type="8" value="5"/>
+ <xsl:apply-templates select="attr[@type=9]"/>
+ <xsl:apply-templates select="term"/>
+ </apt>
+ </xsl:template>
+ -->
+
<!-- term rewrites -->
<!-- rewrite general term fish to squid -->
+ <!--
<xsl:template match="term[@type='general'][text()='fish']">
<term type="general">squid</term>
</xsl:template>
-
+ -->
<!-- operator rewrites -->
+
+ <!-- remove 'not' operator, use first <apt> only -->
+ <!--
+ <xsl:template match="operator[@type='not']">
+ <xsl:apply-templates select="apt[1]"/>
+ </xsl:template>
+ -->
+
<!-- nasty rewrite 'not' operator to 'and' operator -->
<!--
<xsl:template match="operator[@type='not']">
</xsl:template>
-->
- <!-- remove 'not' operator, use first <apt> only -->
- <xsl:template match="operator[@type='not']">
- <xsl:apply-templates select="apt[1]"/>
- </xsl:template>
-
-
-
- <!-- more nasty things for special occasions
- depending on multiple attribute combinations -->
-
- <!-- whenever there is a <apt> containing a @attr 7 and a @attr 8,
- rewrite these and drop all @attr 3,
- finally sort all other @attrs according to type
- and call all terms, still rewriting 'fish' to 'squid' -->
-
- <xsl:template match="apt[attr/@type=7 and attr/@type=8]">
- <apt>
- <xsl:apply-templates select="attr[@type=1]"/>
- <xsl:apply-templates select="attr[@type=2]"/>
- <xsl:apply-templates select="attr[@type=4]"/>
- <xsl:apply-templates select="attr[@type=5]"/>
- <xsl:apply-templates select="attr[@type=6]"/>
- <attr type="7" value="2"/>
- <attr type="8" value="5"/>
- <xsl:apply-templates select="attr[@type=9]"/>
- <xsl:apply-templates select="term"/>
- </apt>
- </xsl:template>
-
-
-
-
</xsl:stylesheet>