Xslt 处理指令转换
我想将源xml中的处理指令转换为输出中的某个标记 输入Xslt 处理指令转换,xslt,Xslt,我想将源xml中的处理指令转换为输出中的某个标记 输入 一些文本 我想要这样的输出xml 一些文本 我能做吗?如果是,转换必须使用什么xsl 我只找到了一种将PI转换为开始和结束标记的方法。PI可以包含一些内容 输入XML <root> <?PI SOME TEXT?> </root> <xsl:template match="processing-instruction('PI')"> <tag><xs
一些文本
我想要这样的输出xml
一些文本
我能做吗?如果是,转换必须使用什么xsl
我只找到了一种将PI转换为开始和结束标记的方法。PI可以包含一些内容
输入XML
<root>
<?PI SOME TEXT?>
</root>
<xsl:template match="processing-instruction('PI')">
<tag><xsl:value-of select="."/></tag>
</xsl:template>
XSL
<root>
<?PI SOME TEXT?>
</root>
<xsl:template match="processing-instruction('PI')">
<tag><xsl:value-of select="."/></tag>
</xsl:template>
输出
<tag>SOME TEXT</tag>
<root>
<?PI_start?> <strong>Some</strong> TEXT <?PI_end?> XA <?PI_end?>
</root>
一些文本
但这与我的情况有点不同这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('PI_start')">
<tag>
<xsl:apply-templates mode="copy" select=
"following-sibling::node()[1][self::text()]"/>
</tag>
</xsl:template>
<xsl:template match=
"processing-instruction('PI_end')
|
text()[preceding-sibling::node()[1]
[self::processing-instruction('PI_start')]]
"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<root>
<?PI_start?> SOME TEXT <?PI_end?>
</root>
<root>
<tag> SOME TEXT </tag>
</root>
<root>
<?PI_start?> <strong>Some</strong> TEXT <?PI_end?> XA <?PI_end?>
</root>
<root>
<tag>
<strong>Some</strong> TEXT
</tag> XA
</root>
将上述转换应用于以下XML文档时:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('PI_start')">
<tag>
<xsl:apply-templates mode="copy" select=
"following-sibling::node()[1][self::text()]"/>
</tag>
</xsl:template>
<xsl:template match=
"processing-instruction('PI_end')
|
text()[preceding-sibling::node()[1]
[self::processing-instruction('PI_start')]]
"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<root>
<?PI_start?> SOME TEXT <?PI_end?>
</root>
<root>
<tag> SOME TEXT </tag>
</root>
<root>
<?PI_start?> <strong>Some</strong> TEXT <?PI_end?> XA <?PI_end?>
</root>
<root>
<tag>
<strong>Some</strong> TEXT
</tag> XA
</root>
一些文本
生成所需的正确输出:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('PI_start')">
<tag>
<xsl:apply-templates mode="copy" select=
"following-sibling::node()[1][self::text()]"/>
</tag>
</xsl:template>
<xsl:template match=
"processing-instruction('PI_end')
|
text()[preceding-sibling::node()[1]
[self::processing-instruction('PI_start')]]
"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<root>
<?PI_start?> SOME TEXT <?PI_end?>
</root>
<root>
<tag> SOME TEXT </tag>
</root>
<root>
<?PI_start?> <strong>Some</strong> TEXT <?PI_end?> XA <?PI_end?>
</root>
<root>
<tag>
<strong>Some</strong> TEXT
</tag> XA
</root>
一些文本
XA
我提出了另一种解决问题的方法。我希望这是正确的
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('PI_start')">
<xsl:text disable-output-escaping="yes"><![CDATA[<tag>]]></xsl:text>
</xsl:template>
<xsl:template match="processing-instruction('PI_end')">
<xsl:text disable-output-escaping="yes"><![CDATA[</tag>]]></xsl:text>
</xsl:template>
]]>
]]>
输入
<tag>SOME TEXT</tag>
<root>
<?PI_start?> <strong>Some</strong> TEXT <?PI_end?> XA <?PI_end?>
</root>
一些文本
生成正确的输出
<root>
<tag> <strong>Some</strong> TEXT </tag> XA </tag>
</root>
一些文本
非常好的问题,+1。请参阅我的答案,了解一个使用最基本XSLT设计模式全部功能的解决方案。@Dimitre:“strip text nodes”规则不是很普遍吗?在标签之间摸索不是更好吗?@Alejandro:不,你为什么认为不应该使用这个指令?@Dimitre:也许text()[前面的兄弟姐妹::节点()[1][self::processing instruction('PI_start')]]
会更好。你不这么认为吗?@Alej,是的,我也要说同样的话。换句话说,@Dimitre的代码将丢失紧跟在
之后的任何文本。如果输入可以有这样的文本。这个例子没有,但我们不知道真正的输入。@Alejandro,@LarsH:伙计们,我一点也不明白你们在说什么。哪种模板?始终避免使用DOE——它不仅破坏了XSLT体系结构,而且不是强制性的XSLT功能,也不能保证任何/所有XSLT处理器都支持它。Dimitre,什么是“DOE”?DOE必须是:禁用输出转义=“是”