XSL 在特定字符上拆分字符串并应用处理(来自 DITA Open Toolkit Processing 的示例)
XSL split string on specific characters and apply processing (Example From DITA Open Toolkit Processing)
我的 XSL 中已经有这条规则:
<xsl:template match="title[starts-with(.,'Key Information for')]">
<xsl:copy>
<xsl:attribute name="outputclass">Key Information Long</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
它的作用:在 DITA Open Toolkit pre-processing 期间将 outputclass='Key Information'
添加到以 "Key Information for" 开头的 title
标签。
我需要做的是将 XPath 添加到匹配规则中,以找到符合此模式的其他标题:
<title>Some title text (More title text)</title>
我的 xsl xpath 需要识别以括号中包含的文本结尾的标题并添加一些新标记 (<ph aid:cstyle="parenthetical-subtitle">(More title text)</ph>
到该标题。当我添加此规则时,我还需要知道如何与现有规则集成,以便它也得到额外的处理(并避免歧义冲突:现有规则和新规则都可以应用于同一内容实例)。
我正在想象使用 ends-with() 函数进行涉及 choose/when 逻辑的编辑,但我在确切的操作方法上碰壁了,结果发现我正在使用的工具包版本仅支持 xml 1.0。举例说明--
如果我有这个输入 xml:
<section>
<title>Key Information for Our Test Process</title>
<p>Some stupid content.</p>
</section>
<section>
<title>Some Other Title</title>
<p>Other content.</p>
</section>
<section>
<title>Key Information for Testing (Stupid People Only)</title>
<p>Parentheses identify an audience which could really be anything.</p>
</section>
我希望对我的规则进行编辑以生成此输出:
<section>
<title outputclass="Key Information Long">Key Information for Our Test Process</title>
<p>Some stupid content.</p>
</section>
<section>
<title>Some Other Title</title>
<p>Other content.</p>
</section>
<section>
<title outputclass="Key Information Long">Key Information for Testing <ph aid:cstyle="parenthetical-subtitle">(Stupid People Only)</ph></title>
<p>Parentheses identify an audience which could really be anything.</p>
</section>
如果我们可以假设 title
元素没有元素子元素而只有纯文本,并且您有一个 XSLT 2 或 3 处理器,因为提到 ends-with
建议您可以匹配中的文本节点元素并用 xsl:analyze-string
:
处理它
<xsl:template match="title[starts-with(.,'Key Information for')]">
<xsl:copy>
<xsl:attribute name="outputclass">Key Information Long</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="title[starts-with(.,'Key Information for')]/text()">
<xsl:analyze-string select="." regex="\(.*\)$">
<xsl:matching-substring>
<ph aid:cstyle="parenthetical-subtitle">
<xsl:value-of select="."/>
</ph>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
您可以使用以下条件识别以括号中的文本结尾的 title
(尽管不一定是平衡的括号):
contains(., '(') and substring(., string-length(.))=')'
您可以在单独的模板中将其用作谓词,并赋予它与现有模板不同的优先级。
我的 XSL 中已经有这条规则:
<xsl:template match="title[starts-with(.,'Key Information for')]">
<xsl:copy>
<xsl:attribute name="outputclass">Key Information Long</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
它的作用:在 DITA Open Toolkit pre-processing 期间将 outputclass='Key Information'
添加到以 "Key Information for" 开头的 title
标签。
我需要做的是将 XPath 添加到匹配规则中,以找到符合此模式的其他标题:
<title>Some title text (More title text)</title>
我的 xsl xpath 需要识别以括号中包含的文本结尾的标题并添加一些新标记 (<ph aid:cstyle="parenthetical-subtitle">(More title text)</ph>
到该标题。当我添加此规则时,我还需要知道如何与现有规则集成,以便它也得到额外的处理(并避免歧义冲突:现有规则和新规则都可以应用于同一内容实例)。
我正在想象使用 ends-with() 函数进行涉及 choose/when 逻辑的编辑,但我在确切的操作方法上碰壁了,结果发现我正在使用的工具包版本仅支持 xml 1.0。举例说明--
如果我有这个输入 xml:
<section>
<title>Key Information for Our Test Process</title>
<p>Some stupid content.</p>
</section>
<section>
<title>Some Other Title</title>
<p>Other content.</p>
</section>
<section>
<title>Key Information for Testing (Stupid People Only)</title>
<p>Parentheses identify an audience which could really be anything.</p>
</section>
我希望对我的规则进行编辑以生成此输出:
<section>
<title outputclass="Key Information Long">Key Information for Our Test Process</title>
<p>Some stupid content.</p>
</section>
<section>
<title>Some Other Title</title>
<p>Other content.</p>
</section>
<section>
<title outputclass="Key Information Long">Key Information for Testing <ph aid:cstyle="parenthetical-subtitle">(Stupid People Only)</ph></title>
<p>Parentheses identify an audience which could really be anything.</p>
</section>
如果我们可以假设 title
元素没有元素子元素而只有纯文本,并且您有一个 XSLT 2 或 3 处理器,因为提到 ends-with
建议您可以匹配中的文本节点元素并用 xsl:analyze-string
:
<xsl:template match="title[starts-with(.,'Key Information for')]">
<xsl:copy>
<xsl:attribute name="outputclass">Key Information Long</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="title[starts-with(.,'Key Information for')]/text()">
<xsl:analyze-string select="." regex="\(.*\)$">
<xsl:matching-substring>
<ph aid:cstyle="parenthetical-subtitle">
<xsl:value-of select="."/>
</ph>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
您可以使用以下条件识别以括号中的文本结尾的 title
(尽管不一定是平衡的括号):
contains(., '(') and substring(., string-length(.))=')'
您可以在单独的模板中将其用作谓词,并赋予它与现有模板不同的优先级。