具有属性识别失败的 XSL 正则表达式



这是我的xml源。如您所见,它没有常规结构 - 请参阅此处的"auteur_5f_nom"

<?xml version="1.0" encoding="UTF-8"?>
<texte>
 <Standard/>
 <Standard/>
 <Standard>
  <auteur_5f_nom>auteur_nom XXX XXX </auteur_5f_nom>
  <auteur_5f_prenom>auteur_prenom XXX </auteur_5f_prenom>
  <date_5f_action>date_action 00/00/00 </date_5f_action>
  <date_5f_redaction>date_redaction 00/00/00 </date_5f_redaction>
  <mail/>
  <texteID>TexteID </texteID>
  <texteID>1234 </texteID>
   01 
 </Standard>
</texte>

。稍后在文档源中,"auteur_5f_nom"标记:

</Standard>
<Standard/>
<Standard>
 <auteur_5f_nom>auteur_nom </auteur_5f_nom>
 <auteur_5f_nom>XXX </auteur_5f_nom>
 <auteur_5f_nom>auteur_prenom </auteur_5f_nom>
 <auteur_5f_prenom>XXX </auteur_5f_prenom>
 <date_5f_action>date_action 00/00/00 </date_5f_action>
 <date_5f_redaction>date_redaction 00/00/00 </date_5f_redaction>
 <mail/>
 <texteID>TexteID </texteID>
 <texteID>1234 </texteID>
  01
</Standard>

我想创建一个 xsl 转换以获得此输出:

<paragraphe auteur_nom = "XXX XXX" auteur_prenom = "XXX" date_action = "00/00/00" texte_id = "205801"/>

问题是:如何在这样格式错误的文档中创建常规 XSL 转换,其中标记"auteur_5f_nom"可以是:

1. <auteur_5f_nom>auteur_nom </auteur_5f_nom>
2. <auteur_5f_nom>auteur_nom XXX XXX </auteur_5f_nom>
3. <auteur_5f_nom>XXX </auteur_5f_nom>
4. <auteur_5f_nom>auteur_prenom </auteur_5f_nom>

我想创建一个新标签,我称之为"p"作为上面的段落,并将我的 xml 源中的"标签"转换为属性,并将其文本用作属性的值。

这是你要找的吗?

样式表

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/test">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
   </xsl:template>
   <xsl:template match="tag">
       <p tag="{normalize-space(.)}">
           <xsl:text>some text</xsl:text>
       </p>
   </xsl:template>
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <p tag="tag X">some text</p>
  <p tag="X">some text</p>
  <p tag="tag">some text</p>
  <p tag="X">some text</p>
  <p tag="tag2">some text</p>
</test>

我想创建一个新标签,我称之为"p"作为段落 以上,并将我的 XML 源中的"标签"转换为属性和 使用其文本作为属性的值。

如果这是它的要点,它可以非常简单地通过以下方式完成:

<xsl:template match="tag">
    <p>
        <xsl:attribute name="tag" select="."/>
    </p>
</xsl:template>

或者,如果您更喜欢较短的:

<xsl:template match="tag">
    <p tag="{.}"/>
</xsl:template>

它无法识别"标签X"和"标签"之间的区别。

您的 matches('.','tag\s.') 函数表示查找文本"tag",后跟一个空格,后跟字符串中任意位置的"零或更多"字符。将"更改为"+",您现在正在寻找"一个或多个"字符,这些字符现在将与"标签X"匹配,但与"标签"不匹配。但请注意,"." 将匹配任何字符,包括更多空格。在进行匹配比较之前,您可能希望接受其他人提供的使用 normalize-space() 的建议。

最新更新