Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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的转换_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

XML-XSLT到XML的转换

XML-XSLT到XML的转换,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有一个将XML文件转换为JSON格式的XSLT样式表,XML模式的一部分允许任何XML,我只需要在相应的JSON中将其编码为字符串 我已经创建了元素,我只是在让名称空间正确运行方面遇到了问题 问题是当前元素范围内的每个名称空间都是为每个元素输出的。我只想输出最初在原始XML中声明的名称空间 这就是我目前正在尝试做的,我已经尝试了一些事情,但无法找到一种方法来做我需要的事情 我调用一个模板,该模板负责转换当前节点的属性: <xsl:call-template name="elementAt

我有一个将XML文件转换为JSON格式的XSLT样式表,XML模式的一部分允许任何XML,我只需要在相应的JSON中将其编码为字符串

我已经创建了元素,我只是在让名称空间正确运行方面遇到了问题

问题是当前元素范围内的每个名称空间都是为每个元素输出的。我只想输出最初在原始XML中声明的名称空间

这就是我目前正在尝试做的,我已经尝试了一些事情,但无法找到一种方法来做我需要的事情

我调用一个模板,该模板负责转换当前节点的属性:

<xsl:call-template name="elementAttributes">
        <xsl:with-param name="element" select="."/>
</xsl:call-template>

使用以下模板:

<xsl:template name="elementAttributes">
        <xsl:param name="element"/>
        <xsl:for-each select="$element/namespace::*">
            <!--dont include default namespace-->
            <xsl:if test="boolean(name())">
                <xsl:text> </xsl:text>
                <xsl:value-of select="name()"/>
                <xsl:text>='</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>'</xsl:text>
            </xsl:if>
        </xsl:for-each>
</xsl:template>

='
'
例如,对于XML:

<valueString>
        <dms:animal xmlns:dms="http://test.net/2012/dms/">
            <dms:dog>woof</dms:dog>
            <dms:cat>meow</dms:cat>
            <reptile:crocodile xmlns:reptile="http://reptile.test.net/2012/dms/"></reptile:crocodile>
        </dms:animal>
</valueString>

汪汪
喵
我的结局是:

<dms:animal dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>
<dms:dog dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>woof</dms:dog>
<dms:cat dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>meow</dms:cat>
<reptile:crocodile dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' reptile='http://reptile.test.net/2012/dms/' xml='http://www.w3.org/XML/1998/namespace'/>

汪汪
喵

当我基本上只想得到相同的XML时


我知道可以通过复制轻松地将XML复制到输出,但由于JSON格式的原因,我将结果输出为文本,因此我无法让它以这种方式工作,因为只复制文本节点,而不复制XML结构。

我想说,您尝试的是一种非常奇怪的设计。我的直觉是回到需求阶段,看看不同的设计是否更有意义


但是,如果您真的想做您正试图做的事情,那么您必须检查每个名称空间,并且仅当名称空间在该元素的范围内而不是在父元素的范围内时才输出它。

Michael Kay是正确的。请务必查看我的XPath可视化工具的代码,以了解如何做到这一点: