需要专家帮助才能使用XSLT获得所需的输出。基本上试图找到一种方法来做树结构或文件夹导航。如果根节点有子节点,我需要设置type : object
。并将子节点名称放在properties:
下。 xml是动态的,我不知道节点名称,因为它来自数据库。
XML
<response>
<Node_A_1>
<Node_B_1>P</Node_B_1>
<Node_B_2>
<Node_C_1>B</Node_C_1>
<Node_C_2>B</Node_C_2>
</Node_B_2>
<Node_B_3>4110838</Node_B_3>
</Node_A_1>
<Node_A_2>
<Node_B_6>Ok</Node_B_6>
<Node_B_7>
<Node_C_6>2016-04-13T08:57:23.552-05:00</Node_C_6>
</Node_B_7>
<Node_B_8>200</Node_B_8>
</Node_A_2>
预期结果
response:
type: Object
properties:
Node_A_1:
type: Object
properties:
Node_B_1:
type: string
Node_B_2:
type: Object
properties:
Node_C_1:
type: string
Node_C_2:
type: string
Node_B_3:
type: string
Node_A_2:
type: object
properties:
Node_B_6
type: String
Node_B_7
type: object
properties:
Node_C_6
type: String
Node_B_8
type: String
到目前为止,我已经提出了以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="*" name="makeUL">
<ul>
<xsl:apply-templates select="*"/>
</ul>
</xsl:template>
<xsl:template match="*">
<li>
<xsl:value-of select="name()" />
<xsl:call-template name="makeUL"/>
</li>
</xsl:template>
</xsl:stylesheet>
当前输出
response
Node_A_1
Node_B_1
Node_B_2
Node_C_1
Node_C_2
Node_B_3
Node_A_2
Node_B_6
Node_B_7
Node_C_6
Node_B_8
现在我需要找到一种方法来检查节点是否有子节点,这样我就可以打印type:object
并打印type:string
如果节点没有任何子节点。这些属性(类型,属性)不是XML的一部分,而是基于子节点的存在而派生的。
答案 0 :(得分:0)
以这种方式试试吗?
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="*[*]">
<li>
<xsl:value-of select="name()"/>
<br/>
<xsl:text>type: object</xsl:text>
<br/>
<xsl:text>properties:</xsl:text>
<ul>
<xsl:apply-templates/>
</ul>
</li>
</xsl:template>
<xsl:template match="*">
<li>
<xsl:value-of select="name()"/>
<br/>
<xsl:text>type: string </xsl:text>
</li>
</xsl:template>
</xsl:stylesheet>
很抱歉这个混乱。这不适用于浏览器UI目的。我是 试图发送txt响应
对于文本输出,请尝试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[*]">
<xsl:param name="indent"/>
<xsl:value-of select="$indent"/>
<xsl:value-of select="name()"/>
<xsl:value-of select="concat(' ', $indent)"/>
<xsl:text> type: object</xsl:text>
<xsl:value-of select="concat(' ', $indent)"/>
<xsl:text> properties:</xsl:text>
<xsl:text> </xsl:text>
<xsl:apply-templates>
<xsl:with-param name="indent" select="concat($indent, ' ')"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="*">
<xsl:param name="indent"/>
<xsl:value-of select="$indent"/>
<xsl:value-of select="name()"/>
<xsl:value-of select="concat(' ', $indent)"/>
<xsl:text> type: string </xsl:text>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
基本的解决方案就像是从michael.hor257k中获得了具有子元素的元素的模板:
<xsl:template match="*[*]">
和没有子元素的一个:
<xsl:template match="*[not(*)]">
谓词([not(*)]
)并不是因为匹配*[*]
具有聘用优先权。
尝试:
<xsl:template match="*[*]">
<li>
<span><xsl:value-of select="name()" /></span>
<ul>
<li>type: Object</li>
<li>
<span>
<xsl:text>properties:</xsl:text>
</span>
<ul>
<xsl:apply-templates select="*"/>
</ul>
</li>
</ul>
</li>
</xsl:template>
<xsl:template match="*[not(*)]">
<li>
<span><xsl:value-of select="name()" /></span>
<ul>
<li>type: string</li>
</ul>
</li>
</xsl:template>
将生成: