[英]<xsl:copy-of> does not preserve XML tags
使用Saxon HE 11.4
,我试图简单地复制一些文本并在该文本中保留 XML 标签。 这个答案和许多其他答案告诉我,只需使用<xsl:copy-of>
就足够了。 但它在我的情况下不起作用, <xsl:copy-of>
删除所有 XML 标签。 为什么?
输入 XML
<?xml version="1.0" encoding="utf-8"?>
<root>
<card>
<k>а</k>
<body>
<meaning>
<trn>возглас удивления</trn>
<trn>вопрос с оттенком удивления или неудовольствия</trn>
</meaning>
</body>
</card>
</root>
XSLT 档案
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:character-map name="escape-square-brackets">
<xsl:output-character character="[" string="\["/>
<xsl:output-character character="]" string="\]"/>
</xsl:character-map>
<xsl:output method="text" encoding="utf-16le" byte-order-mark="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<xsl:result-document href="/Users/xinatanil/Desktop/compiling stuff/abbyy_udahin_kg_ru.dsl" method="text">
<xsl:text>#NAME "Кыргызско-русский словарь"</xsl:text>
<xsl:text>
</xsl:text>
<xsl:text>#INDEX_LANGUAGE "Russian"</xsl:text>
<xsl:text>
</xsl:text>
<xsl:text>#CONTENTS_LANGUAGE "Russian"</xsl:text>
<xsl:text>
</xsl:text>
<xsl:text>
</xsl:text>
<root>
<xsl:for-each select="card">
<xsl:value-of select="k"/>
<xsl:text>
</xsl:text>
<xsl:for-each select="body/meaning/*">
<xsl:text> </xsl:text>
<xsl:copy-of select="node()"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
</root>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
预计 output
#NAME "Кыргызско-русский словарь"
#INDEX_LANGUAGE "Russian"
#CONTENTS_LANGUAGE "Russian"
а
<trn>возглас удивления</trn>
<trn>вопрос с оттенком удивления или неудовольствия</trn>
我目前得到的 Output
#NAME "Кыргызско-русский словарь"
#INDEX_LANGUAGE "Russian"
#CONTENTS_LANGUAGE "Russian"
а
возглас удивления
вопрос с оттенком удивления или неудовольствия
您已将text
用作xsl:output method
,这样您就不会获得元素节点的副本,而只会获得文本节点。 因此,如果您的目标格式是 XML 而不是纯文本,请使用例如<xsl:output method="xml"/>
。
首先将主要的 output 方法更改为 xml 并将其从xsl:result-document
元素中删除。
接下来,如果你想复制已经选择的元素,它们是meaning
的孩子,你需要改变:
<xsl:copy-of select="node()"/>
到:
<xsl:copy-of select="."/>
否则,您将复制这些元素的子节点。
你可能想删除root
包装器。
并且您还需要抑制 XML 声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.