我有一个XSLT样式表,它将XML文件转换为JSON格式,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结构。
我想说,你试图做的是一个非常奇怪的设计。我所有的直觉都是回到需求阶段,看看不同的设计是否更有意义。
但是,如果您真的想做您正在尝试做的事情,则必须检查每个命名空间,并且只有当命名空间在该元素的范围内而不是父元素的范围时才输出它。