Frage

I have the following XML

<GSP>
    <RES>
        <R N="1">
            <MT N="NonEnglishAbstract" V="[DE]Deutsch Abstract text[FR]French Abstract text[AB]Not new language"/>
        </R>
    </RES>
</GSP>

I use the below XSLT to format the output as given further below

XSLT

<xsl:template match="MT[@N='NonEnglishAbstract']">
    <xsl:analyze-string select="@V" regex="\[([^\[\]]+)\]([^\[]+)">
        <xsl:matching-substring>
            <p class="{regex-group(1)}">
                <xsl:value-of select="regex-group(2)"/>
            </p>
        </xsl:matching-substring>
    </xsl:analyze-string>
</xsl:template>

Output

<p class="DE">Deutsch Abstract text</p>
<p class="FR">French Abstract text</p>
<p class="AB">Not new language</p>

The regex in the XSLT matches any pattern like [DE], [FR], [AB], [CD] etc. Now I want to match only certain ones like [DE], [FR] etc. which I have in a comma delimited variable like

<xsl:variable name="language-code>
    <xsl:value-of select="'[DE],[FR],[RU]'"/>
</xsl:variable>

What would be the modified regex to be used in this changed scenario?

Modified Output should be

<p class="DE">Deutsch Abstract text</p>
<p class="FR">French Abstract text[AB]Not new language</p>
War es hilfreich?

Lösung

I have slightly changed the parameter value to pass in the language codes:

<?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:fn="http://www.w3.org/2005/xpath-functions"
  exclude-result-prefixes="xs fn">

<xsl:param name="language-codes" as="xs:string*" select="'DE', 'FR', 'RU'"/>
<xsl:variable name="lang-regex" select="concat('\[(', string-join($language-codes, '|'), ')\]')"/>

<xsl:output method="html" indent="yes"/>

<xsl:template match="MT[@N='NonEnglishAbstract']">
  <xsl:variable name="matches">
    <xsl:analyze-string select="@V" regex="{$lang-regex}">
        <xsl:matching-substring>
          <p class="{regex-group(1)}"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
          <value><xsl:value-of select="."/></value>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:variable>
  <xsl:for-each select="$matches/p">
    <p class="{@class}">
      <xsl:value-of select="following-sibling::value[1]"/>
    </p>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top