2016-08-04 4 views
1

Ich habe den folgenden XML-Code.Regex enthält geben die falsche Ausgabe

<pgs>IVA.004, 168IA.002</pgs> 

Und ich versuche, die Daten vor . zu erhalten und um eine Übereinstimmung mit regex schreiben. Unten ist mein XSLT.

<xsl:template match="pgs"> 
     <td class="pgs"> 
      <xsl:analyze-string select="." regex="([\w]+)\.([\w]+)"> 
       <xsl:matching-substring> 
        <xsl:variable name="nonStringFirstNum" select="number(translate(regex-group(1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',''))"/> 
        <xsl:variable name="nonStringSecondNum" select="number(translate(regex-group(3),'ABCDEFGHIJKLMNOPQRSTUVWXYZ',''))"/> 
        <xsl:variable name="refVar"> 
         <xsl:choose> 
          <xsl:when test="matches(regex-group(1),'XV') or matches(regex-group(1),'Sch') or ($nonStringFirstNum > 367)"> 
           <xsl:value-of select="concat('er:#Link_PT_15/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'XIII') or ($nonStringFirstNum > 348 and $nonStringFirstNum &lt; 361)"> 
           <xsl:value-of select="concat('er:#Link_PT_13/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'XII') or ($nonStringFirstNum > 341 and $nonStringFirstNum &lt; 344)"> 
           <xsl:value-of select="concat('er:#Link_PT_12/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'X') or ($nonStringFirstNum > 325 and $nonStringFirstNum &lt; 332)"> 
           <xsl:value-of select="concat('er:#Link_PT_10/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'IX') or ($nonStringFirstNum > 323 and $nonStringFirstNum &lt; 326)"> 
           <xsl:value-of select="concat('er:#Link_PT_09/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'VIII') or ($nonStringFirstNum > 306 and $nonStringFirstNum &lt; 310)"> 
           <xsl:value-of select="concat('er:#Link_PT_08/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'VII') or ($nonStringFirstNum > 305 and $nonStringFirstNum &lt; 307)"> 
           <xsl:value-of select="concat('er:#Link_PT_07/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'VI') or ($nonStringFirstNum > 296 and $nonStringFirstNum &lt; 303)"> 
           <xsl:value-of select="concat('er:#Link_PT_06/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'V') or ($nonStringFirstNum > 168 and $nonStringFirstNum &lt; 297)"> 
           <xsl:value-of select="concat('er:#Link_PT_05/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'IV') or ($nonStringFirstNum > 114 and $nonStringFirstNum &lt; 169)"> 
           <xsl:value-of select="concat('er:#Link_PT_04/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'II') or ($nonStringFirstNum > 36 and $nonStringFirstNum &lt; 80)"> 
           <xsl:value-of select="concat('er:#Link_PT_02/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:when test="matches(regex-group(1),'LT') or ($nonStringFirstNum >= 0 and $nonStringFirstNum &lt; 3)"> 
           <xsl:value-of select="concat('er:#Link_PT_01/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:when> 
          <xsl:otherwise> 
           <xsl:value-of select="concat('er:#Link_CH_02/P',regex-group(1),'-',regex-group(2))"/> 
          </xsl:otherwise> 
         </xsl:choose> 
        </xsl:variable> 
        <a href="{$refVar}"> 
         <xsl:value-of select="."/> 
        </a> 
       </xsl:matching-substring> 
       <xsl:non-matching-substring> 
        <xsl:value-of select="."/> 
       </xsl:non-matching-substring> 
      </xsl:analyze-string> 
     </td> 
    </xsl:template> 

Wenn ich laufen diese IVA.004 mir die Ausgabe als <a href="er:#Link_PT_05/PIVA-004">IVA.004</a> statt <a href="er:#Link_PT_04/PIVA-004">IVA.004</a> gibt. Bitte lassen Sie mich wissen, wo ich falsch liege und wie ich das beheben kann. Hier ist eine Arbeitsgeige.

http://xsltransform.net/jz1PuNJ

Dank

Antwort

1

In xsl: Wählen Sie, zuerst möglich xsl: wenn Bedingung nur zuerst zurück. dh, 'Übereinstimmungen (Regex-Gruppe (1),' V ') wird zuerst zurückgeben, da Ausdruck' V 'enthält, Ich meine' IVA.004 'enthält' V ', gibt es keine Möglichkeit, die nächste zu überprüfen xsl: when, denn nach erfolgreicher Bedingung wird die Kontrolle von der weiteren Überprüfung beendet.

Ändern Sie die Reihenfolge xsl: wie unten angegeben.

<xsl:when test="matches(regex-group(1),'IV') or ($nonStringFirstNum > 114 and $nonStringFirstNum &lt; 169)"> 
    <xsl:value-of select="concat('er:#Link_PT_04/P',regex-group(1),'-',regex-group(2))"/> 
</xsl:when><!--Keep this xsl:when first--> 
<xsl:when test="matches(regex-group(1),'V') or ($nonStringFirstNum > 168 and $nonStringFirstNum &lt; 297)"> 
    <xsl:value-of select="concat('er:#Link_PT_05/P',regex-group(1),'-',regex-group(2))"/> 
</xsl:when><!--Keep this xsl:when next--> 

paar xsl: when braucht, um auch wie folgt ändern

<xsl:when test="matches(regex-group(1),'IX') or ($nonStringFirstNum > 323 and $nonStringFirstNum &lt; 326)"> 
    <xsl:value-of select="concat('er:#Link_PT_09/P',regex-group(1),'-',regex-group(2))"/> 
</xsl:when> 
<xsl:when test="matches(regex-group(1),'X') or ($nonStringFirstNum > 325 and $nonStringFirstNum &lt; 332)"> 
    <xsl:value-of select="concat('er:#Link_PT_10/P',regex-group(1),'-',regex-group(2))"/> 
</xsl:when> 
1

Der String IVA.004 beiden Spiele 'V' und 'IV' und in einem xsl:choose/xsl:when die ersten echten xsl:when verwendet wird, so dass Sie die Reihenfolge der xsl:choose ändern müßten.