|
Subject: [xsl] storing the results of <xsl:analyze-string> in a map From: "Chris Papademetrious christopher.papademetrious@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Wed, 22 Mar 2023 16:11:01 -0000 |
Given various DITA @href values:
test1.dita
test1.dita#test1_id
test1.dita#test1_id
test1.dita#test1_id/fig1_id
test1.dita#./fig1_id
test1.dita#test1_subtopic_id
test1.dita#test1_subtopic_id/fig2_id
#test1_id
#test1_id/fig1_id
#./fig1_id
#test1_subtopic_id
#test1_subtopic_id/fig2_id
I created a regular expression to parse a value into its file, topic ID, and
element ID components:
^([^#]*)(?:#([^/]+)(?:/(.+))?)?$
This pattern contains three capture groups. In XSLT, I needed a way to
persistently store the results for use in subsequent processing. I ended up
storing them in a map:
<xsl:variable name="href" as="map(*)">
<xsl:analyze-string select="@href"
regex="^([^#]*)(?:#([^/]+)(?:/(.+))?)?$">
<xsl:matching-substring>
<xsl:sequence select="map{
'file': regex-group(1),
'topic_id': regex-group(2),
'elt_id': regex-group(3)}"
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>
which allows the values to be queried as $href?file, $href?topic_id, and
$href?elt_id.
Actually for my application, I absorbed a bit of processing into the map
creation:
<xsl:variable name="href" as="map(*)">
<xsl:analyze-string select="@href"
regex="^([^#]*)(?:#([^/]+)(?:/(.+))?)?$">
<xsl:matching-substring>
<xsl:sequence select="map{
'file': if (regex-group(1) ne '') then resolve-uri(regex-group(1),
$current-uri) else $current-uri,
'id': if (regex-group(3) ne '') then regex-group(3) else
regex-group(2)}"/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>
(I could have simplified these with predicate filtering and [1], but I was
going for clarity of intent instead of brevity.)
This seemed like a nice way to store capture group results by name in a way
that survives beyond the scope of <xsl:analyze-string>. Does anyone else have
another favorite way of saving <xsl:analyze-string> capture group values?
* Chris
-----
Chris Papademetrious
Tech Writer, Implementation Group
(610) 628-9718 home office
(570) 460-6078 cell
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] differentiating between *, Michael Kay michaelk | Thread | [xsl] Add items to a sequence, rick@xxxxxxxxxxxxxx |
| Re: [xsl] differentiating between *, Chris Papademetrious | Date | Re: [xsl] How to remove outer tag i, Matt Van Voorhies mv |
| Month |