2

我现在挣扎了一段时间。我刚开始使用 xslt,我的工作正常。尽可能使用模板,我尽量避免使用 for 循环。

我的问题是:我有许多名称相似的节点,唯一的区别是从 1 到(当前)5 的后缀数字。这些都应该转换为没有数字的节点。所以基本上,这就是我所拥有的:

<title1>some title</title1>
<some_other_nodes>....</some_other_nodes>
<title2>some title2</title2>
.
.
.
<title5>....</title5>

这就是我想要的:

<title>some title</title>
.
.
.
<title>some title2</title>
.
.
.
<title>....</title>

是否可以使用模板进行子字符串匹配(仅匹配标题部分)?

谢谢你的帮助!

4

2 回答 2

2

对于 titleN 形式的元素,其中 N 是某个数字,请使用匹配条件,例如 ...

(更正:)

<xsl:template match="*[starts-with(name(),'title')]
                      [number(substring(name(),6))=number(substring(name(),6))]">
  etc...

不太笼统,但又快又脏,如果你想明确地从title1到title5,你可能还会考虑......

<xsl:template match="title1|title2|title3|title4|title5">
于 2012-09-20T07:51:20.240 回答
1

这是一个真正的XSLT 2.0 解决方案,它甚至涵盖了最复杂的情​​况,其他答案未涵盖

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="*[matches(name(), '^title.*?\d+$')]">
  <xsl:element name="{replace(name(), '^(title.*?)\d+$', '$1')}">
    <xsl:copy-of select="namespace::*"/>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时

<t>
    <title1>some title</title1>
    <some_other_nodes>....</some_other_nodes>
    <title2>some title2</title2> . . . 
    <title5>....</title5>
    <titleX253>Complex title</titleX253>
</t>

产生了想要的正确结果

<t>
      <title>some title</title>
      <some_other_nodes>....</some_other_nodes>
      <title>some title2</title> . . . 
    <title>....</title>
      <titleX>Complex title</titleX>
</t>

请注意元素

<titleX253>Complex title</titleX253>

它应该转换为

<titleX>Complex title</titleX>

这不是 Sean Durkin 的答案

于 2012-09-20T12:43:08.833 回答