我得到了一个xml (带有封面的书籍目录),为此我创建了一个xsl,它显示书籍就好像它们在书架上一样。
现在,我希望允许显示底层xml。我想显示/隐藏一个文本区域,在其中我会使用标识规则编写xml。
我该怎么做呢?我的意思是,我已经为"/“和后代(”book“、"authors")写了规则,如果我添加了一个标识规则,那就可以了,直到它自己调用为止,但是当我的一个自定义规则匹配时,我将开始输出与自定义规则相关联的文本。
编辑
正如马丁·霍宁( Martin )和迈克尔·凯( Michael )所建议的,解决方案是使用模式。
<xsl:template match="/">
<html>
<body>
...
<xsl:apply-templates select="foo"" />
...
<textarea>
<xsl:apply-templates select="//*" mode="SERIALIZE" />
</textarea>
</body>
</html>
</xsl:template>
<!-- identity transform -->
<xsl:template match="/ | @* | node()" mode="SERIALIZE" >
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="SERIALIZE" />
</xsl:copy>
</xsl:template>注意mode=“序列化”:
调用应用模板时,
在标识模板的定义和
当递归地调用自己时,它就在内部。
发布于 2018-04-26 17:03:55
如果要显示输入节点的标记,则需要将其序列化。在XSLT3中,有了XPath 3.1的支持,您可以使用serialize函数。
<xsl:template match="book" mode="show">
<pre>
<xsl:value-of select="serialize(.)"/>
</pre>
</xsl:template>https://xsltfiddle.liberty-development.net/jyH9rM4/1有一个使用XSLT3和serialize函数输出book输入元素的标记的例子。
对于早期版本的XSLT,您需要检查XSLT处理程序是否提供或支持扩展函数,或者需要使用XSLT来序列化节点,我建议依赖http://lenzconsulting.com/xml-to-string/中记录的现有库,因为正确使用名称空间和转义是一项复杂的任务,这样的库比快速尝试为元素和属性节点编写模板以生成一些标记要好。
另一方面,如果您真的想使用HTML,考虑到它的内容模型是文本,您可以通过在textara元素(例如<textarea><xsl:copy-of select="."/></textarea> )中输出元素,或者如果您希望通过身份转换来推动它。使用XSLT为相同匹配节点分离两个模板的正确工具是为至少一个模板使用一个命名的mode。在XSLT1.0中,您还需要为该模式设置身份转换模板,在XSLT 2中,您可以更改身份转换模板,以便在xsl:template上使用xsl:template,在xsl:apply-templates中使用mode="#current"。
https://xsltfiddle.liberty-development.net/gWmuiJ2/1有一个示例,它简单地将book元素作为HTML元素的内容与<xsl:copy-of select="."/>一起复制,浏览器似乎处理得很好,以显示XML。
发布于 2018-04-26 22:27:26
混合处理同一节点的两种不同方式的方法是使用模式。您可以通过将不同的mode属性附加到模板规则来定义两种不同的处理模式,还可以通过向mode指令添加一个mode属性来启动特定模式下的处理。
https://stackoverflow.com/questions/50047854
复制相似问题