Subject: Re: [xsl] Algorithm for setting a variable number of attributes From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Tue, 2 Aug 2022 20:24:03 -0000 |
Certainly doable in principle. (A lot of talk of InvisibleXML at Balisage this week, including a birds-of-a-feather session going on right now...) Michael Kay Saxonica > On 2 Aug 2022, at 21:11, Steven D. Majewski steve.majewski@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > > Not a direct answer to this question, but I was just thinking, while going thru the Invisible XML https://invisiblexml.org <https://invisiblexml.org/> intro and tutorial that it would sure be handy if the parser was a callable function from XSLT or XQuery b writing a grammar for things like human written variations of dates would be nicer to deal with than regex code. There are XQuery and XSLT implementations, so maybe itbs doable. > > b Steve M. > > >> On Aug 2, 2022, at 2:50 PM, Martin Honnen martin.honnen@xxxxxx <mailto:martin.honnen@xxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote: >> >> >> On 02.08.2022 19:47, rick@xxxxxxxxxxxxxx <mailto:rick@xxxxxxxxxxxxxx> wrote: >>> Hello All, >>> >>> I have this as my input: >>> >>> <?xml version="1.0" encoding="UTF-8"?> >>> <root> >>> <subtask>SUBTASK 25-31-04-714-080 - (20130315)</subtask> >>> </root> >>> >>> And this is my desired output: >>> >>> <?xml version="1.0" encoding="UTF-8"?> >>> <root> >>> <subtask chapnbr="25" sectnbr="31" subnbr="04" func="714" seq="080" revdate="20130315"/> >>> </root> >>> >>> I am using a function to parse the input and get it down to a tokenized sequence. Sometimes the input may not have all of the same positions of data; for example, it may be: >>> >>> <subtask>SUBTASK 25-31-04</subtask> >>> >>> I can use a series of <xsl:if> statements to add the appropriate attribute values based on count($attributes), but that makes the <xsl:template match=bsubtaskb> a bit busy. I am wondering if there is a better way to do this. For example, can I add the attributes to the element inside my function? Here is my XSLT. Thank you. >>> >> >> You can use xsl:if or xsl:choose/xsl:when of course inside of the function itself, as well as XPath >> >> if (expression) then expression else expression >> >> instead. >> >> It is not clear which values can be missing and how you want to complete them. >> >> As for other approaches, there is xsl:analyze-string and in XSLT 3/XPath 3.1 there is also the XPath analyze-string function you could try with a pattern for the various groups of digits you expect, push the result through a mode that adds the default data for missing groups and push through another mode perhaps that outputs the attribute nodes. >> >> >> >>> <?xml version="1.0" encoding="UTF-8"?> >>> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <http://www.w3.org/1999/XSL/Transform> >>> xmlns:xs="http://www.w3.org/2001/XMLSchema" <http://www.w3.org/2001/XMLSchema> >>> xmlns:math="http://www.w3.org/2005/xpath-functions/math" <http://www.w3.org/2005/xpath-functions/math> >>> xmlns:rq="http://www.frameexpert.com/functions" <http://www.frameexpert.com/functions> >>> exclude-result-prefixes="xs math rq" >>> version="3.0" expand-text="yes"> >>> >>> <xsl:output indent="yes"/> >>> >>> <xsl:template match="/"> >>> <root> >>> <xsl:apply-templates/> >>> </root> >>> </xsl:template> >>> >>> <xsl:template match="subtask"> >>> <xsl:copy> >>> <xsl:variable name="attributes" select="rq:getSubtaskAttributes(.)"/> >>> <xsl:message>{$attributes}</xsl:message> >>> </xsl:copy> >>> </xsl:template> >>> >>> <xsl:function name="rq:getSubtaskAttributes"> >>> <xsl:param name="context"/> >>> <xsl:variable name="variable1" select="replace($context,'[^-\d]+','')"/> >>> <xsl:sequence select="tokenize($variable1,'-')"/> >>> </xsl:function> >>> >>> </xsl:stylesheet> >>> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >>> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/582271> (by email <applewebdata://2884A9F0-684E-43B9-B299-BC128BE670EF>) >> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/504751> (by email <applewebdata://2884A9F0-684E-43B9-B299-BC128BE670EF>) > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by email <>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Algorithm for setting a v, Steven D. Majewski s | Thread | Re: [xsl] Algorithm for setting a v, John Lumley john@xxx |
Re: [xsl] Algorithm for setting a v, Steven D. Majewski s | Date | Re: [xsl] Algorithm for setting a v, John Lumley john@xxx |
Month |