Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
Xml 从XSLT中删除属性并使用结果集_Xml_Xslt_Transform_Chaining - Fatal编程技术网

Xml 从XSLT中删除属性并使用结果集

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">

是否可以从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">

</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实际上意味着删除默认名称空间。