从段落中删除内嵌图像

时间:2017-08-30 11:37:41

标签: xml xslt ms-word openxml

我遇到了XSLT问题而且我完全卡住了。

我的情况如下,我收到一个word文档。我必须翻译成我们的内部XML格式。在此格式中,图像 与段落分开。

我尝试了很多东西,例如每个循环,模板,使用helpercode,但我认为我在XSLT中的知识仅限于修复问题。

简单来说,我收到的Wordxml如下

<w:document>
    <w:p>
        <w:r>
            <w:t>sometext</w:t>
        </w:r>
        <w:r>
            <w:drawing></w:drawing>
        </w:r>
        <w:r>
            <w:t>anothertext</w:t>
        </w:r>
    </w:p>
</w:document>

我正在尝试创建以下任一结果。

选项1:

<w:document>
    <w:p>
        <w:r>
            <w:t>sometext</w:t>
        </w:r>
    </w:p>
    <w:drawing></w:drawing>
    <w:p>
        <w:r>
            <w:t>anothertext</w:t>
        </w:r>
    </w:p>
</w:document>

选项2:

<w:document>
    <w:p>
        <w:r>
            <w:t>sometext</w:t>
        </w:r>
        <w:r>
            <w:t>anothertext</w:t>
        </w:r>
    </w:p>
    <w:drawing></w:drawing>
</w:document>

2 个答案:

答案 0 :(得分:3)

试试这个:

<xsl:template match="w:p[w:r/w:drawing]">
  <xsl:copy>
    <xsl:apply-templates select="*[not(w:drawing)]"/>
  </xsl:copy>
  <xsl:apply-templates select="w:r/w:drawing"/>
</xsl:template>

我不确定这是否会涵盖所有可能性,但是应该根据选项2输出样本。

答案 1 :(得分:0)

以下是选项1 的解决方案:

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

<xsl:template match="w:p">                     <!-- remove outter w:p -->
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="w:r[w:drawing]">          <!-- move up w:drawing one level -->
  <xsl:copy-of select="*" />
</xsl:template>

<xsl:template match="w:r">                     <!-- encapsulate w:r in w:p and copy it -->
  <w:p>
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </w:p>
</xsl:template>