xslt将mp3标签分为艺术家和标题

时间:2013-06-22 20:39:00

标签: xslt text split

很多时候,mp3标签的形式为"艺术家 - 标题",但存储在标题栏中。

我想将值拆分为艺术家+标题字段。

分割之前/之后的例子:

<title>Artist - Title</title>
<title> - Title</title>
<title>Artist - </title>
<title>A title</title>

后:

<artist>Artist</artist><<title>Title</title>
<artist /><title>Title</title>
<artist>Artist</artist><title />
<artist /><title>A title</title>

我在XSLT编程方面做得不多,所以我不知道我在常规语言中使用的成语是否适合,如果有,那么XSLT语言元素最适合使用。

这就是我正常接近它的方式:

  1. 计算第一个&#34;的位置。 - &#34;
  2. 如果找不到,请按原样返回title元素,并返回空artist元素
  3. 如果在位置0找到它,则将其从title元素中删除,然后将title标记的其余部分作为新title元素返回,并返回空artist元素
  4. 如果在位置长度为3的位置找到它,则将其从title元素中删除,然后将title标记的其余部分作为新artist元素返回,并返回空{{ 1}}元素
  5. 它位于大于0的位置,将所有内容复制到title元素的位置,将其后的所有内容作为新的artist元素返回

1 个答案:

答案 0 :(得分:1)

除了讨论“删除”等不适用(XSLT程序读取输入并生成输出;它们不改变输入),您的描述是非常好的匹配。在这里(未经测试)是人们可以写它的方式(除了我不会对它进行大量评论):

<xsl:template match="title">
  <!--* input often has artist - title in title element *-->
  <!--* So emit an artist element and populate it with
      * the string value preceding the hyphen.
      * (If there is no hyphen, string-before(.,'-') returns ''.)
      * Normalize space to lose the pre-hyphen blank.
      * If hyphens can appear in normal titles, change '-'
      * to ' - '.
      *-->
  <xsl:element name="artist">
    <xsl:value-of select="normalize-space(
                          substring-before(.,'-'))"/>
  </xsl:element>

  <!--* Now emit a title with the rest of the value. *-->
  <xsl:element name="title">
    <xsl:choose>
      <xsl:when test="contains(.,'-')">
        <xsl:value-of select="normalize-space(
                              substring-after(.,'-'))"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:element>
</xsl:template>