Xml 具有属性的xsl正则表达式无法识别

Xml 具有属性的xsl正则表达式无法识别,xml,regex,xslt,Xml,Regex,Xslt,这是我的xml源代码。正如你所看到的,它没有一个规则的结构——请看这里的“auteur_5f_nom” 导演姓名XXX XXX 导演 行动日期00/00/00 修订日期00/00/00 文本ID 1234 01 。。。在文档源的后面,“auteur_5f_nom”标签: 编剧 XXX 导演 XXX 行动日期00/00/00 修订日期00/00/00 文本ID 1234 01 我想创建一个xsl转换以获得以下输出: <paragraphe auteur_nom = "XXX XXX"

这是我的xml源代码。正如你所看到的,它没有一个规则的结构——请看这里的“auteur_5f_nom”


导演姓名XXX XXX
导演
行动日期00/00/00
修订日期00/00/00
文本ID
1234
01
。。。在文档源的后面,“auteur_5f_nom”标签:


编剧
XXX
导演
XXX
行动日期00/00/00
修订日期00/00/00
文本ID
1234
01
我想创建一个xsl转换以获得以下输出:

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

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

1。编剧
2.导演姓名XXX XXX
3.XXX
4.导演
?

我想创建一个新的标记,我在上面的段落中将其称为“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>

一些文本

输出

<?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()的建议。

您能解释一下从给定输入导出输出所需的逻辑吗?您请求的输出仅显示一个
元素,但您的模板生成其中五个元素。而且完全不清楚哪一部分“起作用”,哪一部分不起作用。你的输入中没有“一些文本”。我使用的是一个错误的文本xml文件,因为我的文件是受保护的,所以我不能发布真实的文件。但是,我想创建一个新的标记,我在上面的段落中称之为“p”,并将xml源中的“标记”转换为一个属性,并使用其文本作为属性的值。我想为所有创建一些类似于

的文本。。。这是我的问题,我还没有找到一种方法,只保留“x”并删除所有不是“x”的值(因此“tag”、“tag2”等)。完全不清楚您想要实现什么。编辑您的问题并通过@michael.hor257k回答问题(输入与输出的关系如何,规则是什么,为什么使用正则表达式,什么不起作用)。

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