【问题标题】:Transforming XML with XSL and self closing tags使用 XSL 和自结束标记转换 XML
【发布时间】:2020-09-02 10:38:21
【问题描述】:

我有以下 XML

<run>
    <font style="bold"/>Some Wording
</run>

我想把它改成

<p>
    <b>Some Wording</b>
</p>

我正在尝试这个模板

<xsl:template match="run/font[@style='bold']">
    <p>
        <b>
            <xsl:value-of select="."/>
        </b>
    </p>
</xsl:template>

但这给出了输出

<p>
    <b/>Some Wording
</p>

如何使用 XSLT 将 &lt;b&gt; 标记中的措辞换行?

【问题讨论】:

  • 输出正确。 &lt;font&gt; 标签没有内容,因此您的 &lt;b&gt; 标签也是如此。文本 Some wording 不是 &lt;font&gt; 标记的子标记,因此没有理由将其加粗。
  • 是的,我知道它是正确的,但它不是我想要的。措辞是&lt;run&gt; 标记的子项,但我只想在措辞前面有&lt;font style="bold"&gt; 标记时应用&lt;b&gt; 标记。
  • 看不出你能做到。你的输入文件很奇怪。你应该用粗体元素包裹你的文本。
  • 你能做一个 if 检查,看看一个亲戚是否如你所愿,如果是的话,用所选的标签包装?
  • 如果它是正确的,你为什么要改变它?这里的问题在于输入,而不是转换。如果你需要改变它,它的基本原理是什么?这样的&lt;font&gt; 元素的每个兄弟姐妹?每个后兄弟姐妹?每个兄弟姐妹/兄弟姐妹和他们的孩子?仅文本元素?你需要正确地描述你的问题......一旦这样做了,在 XSLT 中表达它是微不足道的。

标签: xml xslt


【解决方案1】:

如果您的要求是将任何紧跟在&lt;font style="bold"/&gt; 前面的文本节点包装在&lt;b&gt; 元素中,您可以使用

<xsl:template match="text()[preceding-sibling::*[1][self::font][@style='bold']]">
  <b><xsl:value-of select="."/></b>
</xsl:template>

如果这不是您的要求(从一个示例推断要求是出了名的容易出错),那么您需要更清楚地解释它。

【讨论】:

  • 谢谢迈克尔。那成功了。我只需要终止 &lt;b&gt; 就可以了。
  • 我已经修正了错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多