【问题标题】:DOCX w:t (text) elements crossing multiple w:r (run) elements?DOCX w:t(文本)元素跨越多个 w:r(运行)元素?
【发布时间】:2019-03-06 01:27:05
【问题描述】:

我们编写了一个软件,它从 Word 文档的内部 XML 文件中处理 XML,并用替换值替换某些代码。有时我们会发现这样的代码在多次运行之间被打断了。下面是我们有时会遇到的这类事情的一个例子:

<w:r>
  <w:rPr>
    <w:szCs w:val="24"/>
  </w:rPr>
  <w:t xml:space="preserve">After all, if you trust [CAN:Forename.ATTORNEY#01] enough to give</w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:color w:val="000000"/>
  </w:rPr>
  <w:t>[CAN:ObjPronoun.ATTORNEY#01</w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:szCs w:val="24"/>
  </w:rPr>
  <w:t xml:space="preserve">] power of attorney, you should trust </w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:color w:val="000000"/>
  </w:rPr>
  <w:t>[CAN:ObjPronoun.ATTORNEY#01</w:t>
</w:r>
<w:r>
  <w:rPr>
    <w:szCs w:val="24"/>
  </w:rPr>
  <w:t>] enough to make the right decisions at the time.</w:t>
</w:r>

段落开头很好,完整的代码 [CAN:Forename.ATTORNEY#01] 很好地嵌入到单个 w:t 节点中,这很完美,但在此之下,有一个包含代码开头的 w:t 节点, [CAN:ObjPronoun.ATTORNEY#01 但随后 w:t 标记结束,而结束的 ] 将在下一次运行中。

用户体验是段落的开头被渲染得很好,因为[CAN:Forename.ATTORNEY#01]被渲染为某人的名字。但是,当用户在他们的 Word 文档中看到 [CAN:ObjPronoun.ATTORNEY#01] 时,他们 看起来非常好,所以他们希望它也可以呈现为一些文本,我们看不到该代码,因为它被分割了多次运行,因此呈现的文档仍然包含代码,而不是其替换值。

现在我的问题....

谁能解释为什么会发生这种情况?如果用户只是输入代码就可以了,但是如果他们返回并摆弄该段落,就会出现这种情况。有什么我们可以告诉用户“不要这样做”或“不要那样做”或“确保你做某事”的事情。或者 Word 中是否有选项可以防止这种情况发生?

是否有用户可以专门通过 MS Word 前端执行的操作来更正此类段落?目前我们正在指示他们突出显示整个段落,剪切它,将其粘贴到记事本中(它会丢失用户修改历史留下的所有奇怪的碎屑),从记事本中再次复制并将其粘贴回 Word。是的。这样可行。但这有点……不令人满意,至少可以这么说。所以如果有一个原生的 Word 方法来实现同样的事情,那就更优雅了....

【问题讨论】:

标签: xml ms-word openxml docx


【解决方案1】:

这里的问题既不是用户在 Word 中的行为,也不是跨 w:r 元素的文本表示。问题在于软件天真地假设要替换的文本必须存在于单个w:r 元素中。这只是一个糟糕的假设。

您的选择包括

  1. 将替换程序修复为对跨运行分区不敏感。
  2. 规范化 OOXML 以满足脆性替换程序的需要。
  3. 使用其他 OOXML 结构(例如内容控件)而不是文本作为占位符。

【讨论】:

  • 1 of 2 嗯,不,它没有那么简单。该软件没有做出任何“幼稚”的假设......我们非常清楚这样的文本可以分割成多个 w:r 元素。我们可以很容易地重新组合它们。然而,我们面临的问题是附加节点和指令的插入。例如, 或 和 xml:space="preserve"。这些是用户如何维护文档的结果。
  • 2 of 2 在最简单的“解决方案”中,我们可以忽略所有此类指令,只需将文本从一个节点移动到其前一个节点,但这是一个生硬的工具;如果用户对段落的一部分应用了任何实际预期的更改,即在此处加粗一些文本,在此处突出显示某些内容,那么当我们将内容从一个 w:r 节点移动到另一个节点时,这些内容就会消失。因此我的问题是:用户可以做些什么来将相同的设置应用于整个段落,有效地将其全部“重新组合”成一个 w:r - 通过前端。所以我们可以相应地指导他们。
  • PS - 我们的指令剪切段落,将其粘贴到记事本中,如果从记事本复制回 Word 文档,则效果很好。如果他们随后小心地将他们的样式应用到整个“说明”文本或此类“说明”之外的部分段落,那么文档将继续按照期望的方式运行。如果有一个“更简单”的解决方案来实现同样的事情,而不必在 Word 和记事本或某些此类应用程序之间来回切换,那就太好了。
  • 用这样的实现问题给用户带来负担是一种完全错误的方法。您已经成功地陷入了XY-problem 此处。您是在询问用户如何在实施问题上小心翼翼(这应该与他们无关)。相反,您应该纠正设计不佳的 DOCX 文档参数化方法。有关您的实际问题的真正解决方案,请参阅此答案的 1-3。
  • 它们几乎不是“真正的解决方案”。如果我们可以从头开始编写这种软件,他们可能会这样做。相反,这是一个新版本的软件,它已经迭代了可以追溯到 1998 年的多个版本。在那些日子里,我们做出了一些设计决策,唉,现在仍然坚持。是的。欢迎提出实用的解决方案。
【解决方案2】:

同时,回到牧场,我实际上找到了一个非常简单的解决方案。

用户可以识别出不能正常工作的段落,因为在处理之后,它仍然包含代码,而不是它们的替换值。

要修复段落,他们需要做的就是使用格式刷。选择他们喜欢的格式,将其应用于整个有问题的段落和 Bob 的你叔叔,问题就解决了。

【讨论】:

  • 更简单:选择整个有问题的段落,然后按 Ctrl+Space。在需要时重新应用格式。 Bob 是你妈妈的弟弟。
猜你喜欢
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
相关资源
最近更新 更多