spy*_*g63 1 xml xslt xpath json xslt-1.0
是否可以应用仅与唯一属性匹配的模板?
<node name="region">1</node>
<node name="region">2</node>
<node name="region">3</node>
<node name="place">a</node>
<node name="place">b</node>
<node name="title">test</node>
Run Code Online (Sandbox Code Playgroud)
我想一次执行一个模板,@name="region"并一次@name="place".可以使用XSLT/XPath 1.0完成吗?
我的最终目标是JSON输出,如下所示:
"container":{
"region":["1","2","3"],
"place":["a","b"],
"title":"test"
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Muenchian方法来解决分组问题.
这个输入XML,
<container>
<node name="region">1</node>
<node name="region">2</node>
<node name="region">3</node>
<node name="place">a</node>
<node name="place">b</node>
<node name="title">test</node>
</container>
Run Code Online (Sandbox Code Playgroud)
提供给这个XSLT,
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:key name="nodes-by-name" match="node" use="@name"/>
<xsl:template match="container">
<xsl:text>"container": {
</xsl:text>
<xsl:for-each select="node[count(. | key('nodes-by-name', @name)[1]) = 1]">
<xsl:value-of select="concat('"', @name, '":')"/>
<xsl:choose>
<xsl:when test="count(key('nodes-by-name', @name)) = 1">
<xsl:value-of select="concat('"', ., '"')"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>[</xsl:text>
<xsl:for-each select="key('nodes-by-name', @name)">
<xsl:value-of select="concat('"', ., '"')"/>
<xsl:if test="position() != last()">,</xsl:if>
</xsl:for-each>
<xsl:text>]</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position() != last()">,</xsl:if>
<xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
产生这个XML输出,
"container": {
"region":["1","2","3"],
"place":["a","b"],
"title":"test"
}
Run Code Online (Sandbox Code Playgroud)
按照要求.