Xml Word文档的XSLT

Xml Word文档的XSLT,xml,xslt,Xml,Xslt,我正在从事一个项目,需要向用户发送从Linux脚本生成的Word文档。Word文档存储为docx,其中包含一些将由脚本替换的标记(即${Firstname}) 我不能在这台Linux机器上使用Word。我只能使用xsltproc,它使用XSLT1.0,这使得分组更加困难 我编写的脚本对大多数Word文档都很有效,但在某些情况下,当样式没有变化时,Word会在多个标记之间展开一个句子,甚至一个单词 因此,如果样式完全相同,我正试图找出一种方法,在运行()中合并连续的标记 下面是一些示例输入,基于下

我正在从事一个项目,需要向用户发送从Linux脚本生成的Word文档。Word文档存储为docx,其中包含一些将由脚本替换的标记(即
${Firstname}

我不能在这台Linux机器上使用Word。我只能使用xsltproc,它使用XSLT1.0,这使得分组更加困难

我编写的脚本对大多数Word文档都很有效,但在某些情况下,当样式没有变化时,Word会在多个
标记之间展开一个句子,甚至一个单词

因此,如果样式完全相同,我正试图找出一种方法,在运行(
)中合并连续的
标记

下面是一些示例输入,基于下面的注释,我已经对其进行了一些清理,但我并不想隐藏这是Word生成的XML


{if}${Dossier.Person.City.City}==“纽约”{then}家乡!{else}很远{
恩迪夫
}
我想实现的是:

  • 删除所有
    元素。这一点我可以用XSLT轻松做到
但是,我基本上想做:

  • 迭代所有
    元素
  • 如果它们包含样式完全相同的连续运行(
    ),则只需创建一个运行,使用一次样式,并合并所有文本(
  • 将所有其他内容保存在XML中
因此,在这种情况下,我期望的最终结果是:


{if}${Dossier.Person.City.City}==“纽约”{then}家乡!{else}遥远的{endif}
我已经走了这么远,但我不知道如何检查
中的确切值,这意味着段落中的样式更改现在已经消失。它现在只拾取第一个
节点


在发布之前,我曾试图找出各种重复数据消除的方法,但基于这些善意的评论,我再次研究了慕尼黑分组。我还是不明白我怎么能用这个


我不在乎一个段落中的多个
是否具有完全相同的值,只要它们之间存在具有不同值的

执行以下操作:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  
  <xsl:output method="xml" encoding="utf-8" indent="yes"/>
  
  <!-- Identity template : copy all text nodes, elements and attributes -->   
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  
  <!-- Ignore w:proofErr nodes -->
  <xsl:template match="w:proofErr" />
  
  <xsl:template match="w:p">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="w:r[1]"/>
    </xsl:copy>
  </xsl:template>
    
  <xsl:template match="w:r">
    <xsl:variable name="w:rPr" select="w:rPr"/>
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:copy-of select="w:rPr"/> 
      <xsl:element name="w:t">
        <xsl:apply-templates select="(w:t|following-sibling::w:r[w:rPr=$w:rPr]/w:t)/node()"/>
      </xsl:element>
    </xsl:copy>
    <xsl:apply-templates select="following-sibling::w:r[not(w:rPr=$w:rPr)][1]"/>
  </xsl:template>

</xsl:stylesheet>


你的“问题”读起来像是对要完成的工作的说明。这在这里是不合适的。阅读,然后自己尝试,将你的代码作为一部分发布,并准确地解释你得到的与你想要的不匹配。这似乎是一个问题。进行搜索-这可能是这里最常被问到的XSLT问题。请注意,XSLT 1.0或2.0的答案是不同的。@michael.hor257k:这也可能是一个问题,因为要搜索和替换OOXML,消除具有相同格式的连续运行并不能真正解决问题。用户希望搜索和替换独立于格式转换工作。OP应该在这一领域做背景阅读,首先我很抱歉,我会重新表述这个问题,我不想让别人做我的工作,我想解释一下所有这些都会有助于回答。关于XY问题,我有一个潜在的问题,我想替换单词XML中的字符串(XY中的“X”)。我注意到(尤其是Word for Mac)有时会生成可怕的XML,这使得这个问题变得更加困难。我不能简单地在Linux服务器上的脚本工具中使用单词搜索和替换函数。所以我想我会尝试找到一种方法来修复单词XML(XY中的“Y”)。还有另一个Y,但它并不总是工作:而且它在Mac上也不工作。所以我认为清除XM这个词是最有意义的。我已经尝试过了,但是仍然合并了
标记中有更改的运行,结果是抱歉,我的错误,我不明白它应该只合并w:r,如果w:rPr是相同的。我已经调整了xsl示例。您应该调整XML示例以明确这一点。我喜欢它!非常感谢你的帮助!!