Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 处理指令转换_Xslt - Fatal编程技术网

Xslt 处理指令转换

Xslt 处理指令转换,xslt,Xslt,我想将源xml中的处理指令转换为输出中的某个标记 输入 一些文本 我想要这样的输出xml 一些文本 我能做吗?如果是,转换必须使用什么xsl 我只找到了一种将PI转换为开始和结束标记的方法。PI可以包含一些内容 输入XML <root> <?PI SOME TEXT?> </root> <xsl:template match="processing-instruction('PI')"> <tag><xs

我想将源xml中的处理指令转换为输出中的某个标记

输入


一些文本
我想要这样的输出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必须是:禁用输出转义=“是”