Xml 从XSLT中删除属性并使用结果集
是否可以从XSLT中删除xml属性并处理结果转换 换句话说,我有以下XML:Xml 从XSLT中删除属性并使用结果集,xml,xslt,transform,chaining,Xml,Xslt,Transform,Chaining,是否可以从XSLT中删除xml属性并处理结果转换 换句话说,我有以下XML: <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet type="text/xsl" href="XML_TEST.xslt"?> <report xmlns="abc123"> <book> <page id="22"> </page> <page id="23">
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="XML_TEST.xslt"?>
<report xmlns="abc123">
<book>
<page id="22">
</page>
<page id="23">
</page>
</book>
</report>
我知道我可以使用以下XSLT剥离属性:
<xsl:template match ="@*" >
<xsl:attribute name ="{local-name()}" >
<xsl:value-of select ="." />
</xsl:attribute>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match ="*" >
<xsl:element name ="{local-name()}" >
<xsl:apply-templates select ="@* | node()" />
</xsl:element>
</xsl:template>
但是如果我想读取这些值,使用以下模板
<xsl:template match="report">
<xsl:for-each select="book/page">
<xsl:value-of select="@id"/>
</xsl:for-each>
</xsl:template>
我可以将该模板链接到前两个模板的输出吗
提前感谢,
-R
可以删除xml吗
属性,并使用
结果变换
是的,只需搜索“多次转换”就可以找到许多答案,并提供了很好的代码示例
但是,对于您想要做的事情,这种转换链接过于复杂,完全没有必要
只需使用:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="abc123" >
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="x:page">
<xsl:value-of select="@id"/>
</xsl:template>
</xsl:stylesheet>
如果事先不知道XML文档的默认名称空间,您仍然可以在一次传递中生成所需的结果:
<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="*[name()='page']">
<xsl:value-of select="@id"/>
</xsl:template>
</xsl:stylesheet>
<xsl:apply-templates select="exslt:node-set($FirstPass)/report/book/page"/>
这个问题有点奇怪:我看不出你问题的标题与内容如何匹配 在标题中,您要求进行两次变换,其中第一次变换必须删除属性,第二次变换必须处理属性 在内容中,您将显示两个模板,它们输出节点和属性的本地名称,之后,您将在另一个模板中显示希望使用属性的内容获取属性值…:) 根据@Dimitre对你问题的内容的回答(我认为这不是一个真正的问题)我将尝试回答你问题的标题,这似乎更有趣(更容易回答)
从XSLT中删除属性… 要删除属性(并获得不带名称空间的转换),可以使用。因为需要多次传递,所以必须在第一次传递中复制变量上的转换内容 您可以使用在第一个过程中将流程寻址到元素 。。。并使用结果集 要使用结果集(正式名称为a),您需要使用引用将模板应用于第一次传递中定义的变量。欢迎这是第二关:) 由于XSLT2.0能够将模板应用于RTF,因此XSLT2.0比XSLT1.0更容易进行两次转换。在XSLT1.0中,您需要一个名为的特定扩展函数
XSLT2.0将如下所示(纯示例):
XSLT 1.0看起来非常相似,但是transform根元素:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="abc123"
xmlns:exslt="http://exslt.org/common"
version="2.0">
和第二次传球:
<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="*[name()='page']">
<xsl:value-of select="@id"/>
</xsl:template>
</xsl:stylesheet>
<xsl:apply-templates select="exslt:node-set($FirstPass)/report/book/page"/>
许多转换最好分成一个管道,管道的每个阶段执行一个简单的任务
您可以在单个样式表中进行多阶段转换(通过将结果保存在变量中,特别是使用XSLT2.0),也可以使用多个样式表进行转换。您可以使用各种技术(XProc、Cocoon、Orbeon、Ant、xmlsh)或通过自己的Java/C代码控制涉及多个样式表的管道。使用多个样式表的优点是管道的组件高度可重用。您需要两个输出吗?如果不是这样,那么从单个xslt中获取所需内容可能会更容易。你能把你想要得到的结果加起来吗?好问题,+1。有关两个完整、简短、简单和简单的解决方案,请参见我的答案。:)+1表示好的问题标题。@cordsen:我试图获取的值是id的值,因此最终输出应该只是呈现一些简单的内容,如:2223。通过“属性”,OP实际上意味着删除默认名称空间。