【问题标题】:Apply XSLT to add a tag应用 XSLT 添加标签
【发布时间】:2012-05-01 19:28:15
【问题描述】:

我正在从 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>

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

【问题讨论】:

  • 您将其重新标记为 xslt1,但是您有什么理由不能使用 xslt2(因此使用 xslt 2 要容易得多
  • InDesign 不支持 2.0 但是,我后来发现我可以通过其他软件应用它。它已被重新标记为 XSLT 2.0。
  • 好的,那么@DevNull 的回答似乎很好:-)
  • 是的!你是对的。不过,我只有最后一个问题。你知道它是怎么回事,所以它只标记单词后面的数字吗?我尝试更改正则表达式以便它可以做到这一点,但它最终标记了代码中的每个数字。如果你能帮我解决这个问题,我会很高兴的!
  • @babyeumbrella - 我已经更新了我的答案。希望这能满足您的需要。

标签: xml xslt tags xslt-2.0 adobe-indesign


【解决方案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 进行测试。

【讨论】:

  • 如果您有时间并愿意向我解释这是如何工作的,我将永远感激不尽。我发现这个 XSLT 选项非常适合与 InDesign 一起使用,所以如果我能理解它在做什么,也许将来我就不必再打扰你了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2021-10-14
  • 1970-01-01
  • 2023-01-30
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多