2017-06-12 1 views
0

version texteXSLT analyser une partie de division de chaîne de mixedContent nouvel élément dans

XML Source contient un élément nommé mixedContent-paragraph. La plupart du temps, le contenu commence par un chiffre entre parenthèses, par ex. (1). Le numéro est toujours le premier (partie d'un) noeud de texte.

XML Target gère ce numéro spécifique dans un élément distinct nommé counter.

Comment traiter paragraph d'une manière efficace?

masques numéro de l'exemple

(1) 
(0...9) 
[0...9] 
{:digits:} 

source Exemple de paragraphe

<paragraphs> 
    <paragraph>(1) text <try>1</try> <italic>italic</italic> stuff</paragraph> 
    <paragraph>[2] text <try>2</try> <italic>italic</italic> stuff</paragraph> 
    <paragraph>{123} text <try>3</try> <italic>italic</italic> stuff</paragraph> 
    <paragraph>text <try>4</try> <italic>italic</italic> stuff</paragraph> 
</paragraphs> 

Exemple paragraphe cible

<paragraphs>  
    <frame> 
     <counter>(1)</counter> 
     <paragraph>text <try>1</try> <italic>italic</italic> stuff</paragraph> 
    </frame> 
    <frame> 
     <counter>[2]</counter> 
     <paragraph>text <try>2</try> <italic>italic</italic> stuff</paragraph> 
    </frame> 
    <frame> 
     <counter>{123}</counter> 
     <paragraph>text <try>3</try> <italic>italic</italic> stuff</paragraph> 
    </frame> 
    <frame> 
     <paragraph>text <try>4</try> <italic>italic</italic> stuff</paragraph> 
    </frame> 
</paragraphs> 

pas (fonctionnelle) partie

<xsl:template match="paragraph"> 
    <frame> 
     <xsl:analyze-string select="." regex="(^[^\s]+)"><!-- TODO: select digits instead of the first whitespace! --> 
      <xsl:matching-substring> 
       <xsl:element name="counter"> 
        <xsl:value-of select="regex-group(1)" /> 
       </xsl:element> 
      </xsl:matching-substring> 
     </xsl:analyze-string> 
     <paragraph> 
      <xsl:apply-templates/><!-- TODO: everything but not the part of regex-group(1) + whitespace-character --> 
     </paragraph> 
    </frame> 
</xsl:template> 

Je cessé de travailler sur ce modèle peut-être parce qu'il ya une meilleure solution pour résoudre ce problème.

Toute aide est appréciée.

+0

Alors quand avez-vous besoin d'extraire ce compteur, si le premier noeud enfant de l'élément 'paragraph' est un noeud de texte qui commence par l'un des quatre modèles? Ou peut-il y avoir aussi un compteur dans un élément enfant comme ' (1) ...' qui doit être extrait? –

+0

le numéro est toujours en texte brut et doit être le premier (partie d'un) nœud de texte. – uL1

Répondre

1

Si vous avez simplement besoin d'extraire les deux parties du premier noeud enfant qui est un nœud de texte alors je pense que ce qui suit ne que:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 

    <xsl:param name="counter-pattern" as="xs:string">^(\([0-9+]\)|\[[0-9]+\]|\{[0-9]+\})</xsl:param> 

    <xsl:template match="@* | node()" mode="#all"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" mode="#current"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="paragraph"> 
     <frame> 
      <xsl:apply-templates select="." mode="counter"/> 
     </frame> 
    </xsl:template> 

    <xsl:template match="paragraph[node()[1][self::text()[matches(., $counter-pattern)]]]" 
     mode="counter"> 
     <xsl:variable name="components" as="xs:string*"> 
      <xsl:analyze-string select="node()[1]" regex="{$counter-pattern}"> 
       <xsl:matching-substring> 
        <xsl:sequence select="."/> 
       </xsl:matching-substring> 
       <xsl:non-matching-substring> 
        <xsl:sequence select="."/> 
       </xsl:non-matching-substring> 
      </xsl:analyze-string> 
     </xsl:variable> 
     <counter> 
      <xsl:value-of select="$components[1]"/> 
     </counter> 
     <xsl:copy> 
      <xsl:value-of select="$components[2]"/> 
      <xsl:apply-templates select="node()[position() gt 1]"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Vous pouvez utiliser <xsl:value-of select="replace($components[2], '^\s+', '')"/> au lieu de <xsl:value-of select="$components[2]"/> si l'espace blanc entre le compteur et le texte suivant n'est pas censé apparaître dans le paragraphe.

Prenez l'expression régulière comme exemple, vous devrez peut-être adapter cela à vos besoins.