[Home] [By Thread] [By Date] [Recent Entries]
sorry for the messy sample files... my mail client removed the tabs.
I'm using saxon 8.8j i already used keys upon your suggestion, however i did not notice a change in the processing time, but i'll test more files just to be sure. here's now my new xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ati="http://www.asiatype.com/xslt-functions" exclude-result-prefixes="xs ati"> <xsl:output method="xml" version="1.0" encoding="UTF-8"/> <xsl:variable name="abbreviations" as="element()+" select="document('publishers_data.xml')/root/publisher/abbrev"/> <xsl:key name="abbrev" match="expanded" use="preceding-sibling::abbrev"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="text()[ancestor::ab and not(ancestor::note[@id and @n and @lang])][exists($abbreviations[matches(current(),concat('(^|\W)(',ati:escape(.),')($|\W)'))])]"> <xsl:variable name="str" as="xs:string" select="."/> <xsl:variable name="search-str" as="xs:string+" select="$abbreviations[matches($str,concat('(^|\W)(',ati:escape(.),')($|\W)'))]"/> <xsl:variable name="replace" as="element()*"> <xsl:for-each select="$search-str"> <xsl:variable name="abbr" as="xs:string" select="."/> <abbr type="title" expand="{$abbreviations/key('abbrev', $abbr)}"> <xsl:value-of select="$abbr"/> </abbr> </xsl:for-each> </xsl:variable> <xsl:sequence select="ati:replace-with-nodes($str, $search-str, $replace)"/> </xsl:template> <xsl:template match="@*|element()|comment()|processing-instruction()" mode="#all"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:function name="ati:replace-with-nodes" as="node()+"> <xsl:param name="input" as="xs:string"/> <xsl:param name="words-to-replace" as="xs:string*"/> <xsl:param name="replacement" as="node()*"/> <xsl:variable name="regex" select="string-join(for $w in $words-to-replace return concat('(', ati:escape($w), ')'),'|')"/> <xsl:analyze-string select="$input" regex="{$regex}"> <xsl:matching-substring> <xsl:variable name="i" as="xs:integer" select="(1 to count($words-to-replace))[regex-group(.)]"/> <xsl:sequence select="$replacement[$i]"/> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:function> <xsl:function name="ati:escape"> <xsl:param name="s" as="xs:string"/> <xsl:sequence select="replace($s,'[\\\|\.\-\^\?\*\+\(\)\{\}\[\]\$]','\\$0')"/> </xsl:function> </xsl:stylesheet> heres a short version of the publishers_data.xml:
|

Cart



