1

很多时候,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. 计算第一个“-”的位置
  2. 如果未找到,则按原样返回title元素和一个空artist元素
  3. 如果在位置 0 找到它,则将其从元素中删除,然后将标记title的其余部分作为新元素和一个空元素返回titletitleartist
  4. 如果在位置 length-3 找到它,则将其从元素中删除,然后将标记title的其余部分作为新元素和一个空元素返回titleartisttitle
  5. 如果在大于 0 的位置找到它,将所有内容复制到该位置作为artist元素,将其后的所有内容作为新title元素返回
4

1 回答 1

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>
于 2013-06-22T21:25:50.953 回答