我遇到了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>
答案 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>