xsl-list
[Top] [All Lists]

Re: [xsl] XSL | index-of()

2019-09-27 04:30:46
Am 27.09.2019 um 11:14 schrieb Janine Lantzsch loderndesfeuer(_at_)gmx(_dot_)de:
Hello community,
I am new in this list and hope very much that someone can help me or
give me an input with which I can continue to work.

I would like to use XSL to check whether a abbreviation from a list
appears in a certain string of recurring elements. The abbreviation is
always written in brackets. The source file looks like this (very
simplified):
<?xml version="1.0" encoding="UTF-8"?>
<all>
    <abbreviations>
            <abbr>ABG</abbr>
            <abbr>AGI</abbr>
            <abbr>BBL</abbr>
            <abbr>ECK</abbr>
    </abbreviations>
    <documents>
        <doc no="1">The abbreviation (ABG) appears in this doc.</doc>
        <doc no="2">This doc has no shortcut.</doc>
        <doc no="3">An abbreviation (BBL).</doc>
        <doc no="4">And here (ECK).</doc>
        <doc no="5">And here again (ECK).</doc>
    </documents>
</all>

Only unfortunately I still have a bug somewhere with the index-of.
Maybe the more experienced of you will see right away what's wrong
with my code. I've been brooding since last night and can't find a
solution :(
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:fn="http://www.w3.org/2005/xpath-functions"; version="2.0">
    <xsl:output method="xml" encoding="UTF-8"/>
    <xsl:template match="all">
        <xsl:variable name="abbr" select="abbreviations/abbr"/>
        <all>
            <xsl:for-each select="//doc">
                <xsl:variable name="actdoc" select="."/>
                <xsl:if test="fn:contains($actdoc, fn:index-of($abbr,
$actdoc))">


I don't think you want to use `index-of` for the check, nor do you need
to use a nested variable and the if, you can write a predicate

    <xsl:for-each select="//doc[some $a in $abbr satisifies contains(.,
$a)]">

                    <doc>
                        <xsl:attribute name="no"><xsl:value-of
select="@no"/></xsl:attribute>
                        <xsl:value-of select="$actdoc"/>

If you want to output the found abbreviation then use

                            <xsl:value-of
select="$abbr[contains(current(), .)]"/>

--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>