2

我正在从 InDesign 导出 XML 文件。此文件中的文本包含引用特定语法概念的上标;但是,这些上标在 XML 文件中导出为文本。我需要编写一个 XSLT,这样当它应用到 InDesign 文件时,它只会在上标上添加一个小标签。

这是它的导出方式:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<Content>
<PhraseNative aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="260.5">
<Phrase>    1.  Mark is1a playing2 videogames.</Phrase> 
</PhraseNative>
</Content>
</Root>  

这应该是最终代码。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<Content>
<PhraseNative aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="260.5">
<Phrase>    1.  Mark is<tag>1a</tag> playing<tag>2</tag> videogames.</Phrase> 
</PhraseNative>
</Content>
</Root>

只要数字和字母是字符串的最后两位或三位数字,这些标签就会始终出现。有时它只是一个数字。输出根本没有变化。这只是为了使标签在导出回网页时不会丢失。

4

1 回答 1

1

您使用 XSLT 2.0 标记了这个问题,所以这里有一个 2.0 选项。

注意:我必须为aid前缀添加一个虚拟 xmlns。

此外,您很可能需要改进正则表达式,但这应该可以帮助您入门。

XML 输入

<Root>
  <Content>
    <PhraseNative aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="260.5" xmlns:aid="somexmlns">
      <Phrase>    1.  Mark is1a playing2 videogames.</Phrase> 
    </PhraseNative>
  </Content>
</Root>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:aid="somexmlns">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="Phrase">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:analyze-string select="." regex="([a-z]+)([0-9]+[a-z]*)">
        <xsl:matching-substring>
          <xsl:value-of select="regex-group(1)"/>
          <tag>
            <xsl:value-of select="regex-group(2)"/>    
          </tag>
        </xsl:matching-substring>
        <xsl:non-matching-substring><xsl:value-of select="."/></xsl:non-matching-substring>
      </xsl:analyze-string>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XML 输出

<Root>
   <Content>
      <PhraseNative xmlns:aid="somexmlns" aid:table="cell" aid:crows="1" aid:ccols="1"
                    aid:ccolwidth="260.5">
         <Phrase>    1.  Mark is<tag>1a</tag> playing<tag>2</tag> videogames.</Phrase>
      </PhraseNative>
   </Content>
</Root>

使用 Saxon-HE 9.3 进行测试。

于 2012-05-01T19:43:12.147 回答