如何使用XSLT读取XML中嵌入的JSON值并用于DOT格式转换?
XSL解析XML内JSON数组提取url的实现方案
适用XSLT 3.0版本(推荐,原生支持JSON解析)
XSLT 3.0 内置json-to-xml()函数,可以直接将JSON结构转换为可遍历的XML节点树,实现代码如下:
<!-- 核心逻辑片段,可直接嵌入你现有DOT生成的XSL代码中 --> <xsl:template match="Row"> <!-- 先读取items节点的JSON内容,转换为XML节点树 --> <xsl:variable name="items-json" select="json-to-xml(items/text())"/> <!-- 遍历所有url字段 --> <xsl:for-each select="$items-json//*[@key='url']"> <!-- 替换路径前缀:把/tampilanData/换成/displayData/ --> <xsl:variable name="adjusted-url" select="replace(., '/tampilanData/', '/displayData/')"/> <!-- 这里把$adjusted-url填入你需要输出DOT的对应位置即可,示例如下: --> <xsl:text>Node [label="</xsl:text> <xsl:value-of select="$adjusted-url"/> <xsl:text>"]; </xsl:text> </xsl:for-each> <!-- 你原有获取role等普通节点的逻辑保留即可 --> <xsl:value-of select="role"/> </xsl:template>
逻辑说明
- 调用
json-to-xml()后,JSON数组的每个对象会被转为map节点,键名对应@key属性,键值就是节点文本 - 用
replace()函数直接匹配路径前缀替换,自动得到你需要的/displayData/xxx格式路径 - 遍历过程中可以直接输出DOT语法的节点、边定义即可
适用XSLT 1.0/2.0版本(无原生JSON支持)
如果你的XSLT处理器不支持3.0版本,可以用字符串切割的方式提取url:
<xsl:template match="Row"> <xsl:call-template name="extract-urls"> <xsl:with-param name="json-content" select="items/text()"/> </xsl:call-template> <!-- 原有其他逻辑保留 --> </xsl:template> <!-- 递归提取url的自定义模板 --> <xsl:template name="extract-urls"> <xsl:param name="json-content"/> <xsl:choose> <xsl:when test="contains($json-content, '"url": "')"> <xsl:variable name="after-url-prefix" select="substring-after($json-content, '"url": "')"/> <xsl:variable name="raw-url" select="substring-before($after-url-prefix, '"')"/> <xsl:variable name="adjusted-url" select="concat('/displayData/', substring-after($raw-url, '/tampilanData/'))"/> <!-- 输出调整后的url到DOT对应位置 --> <xsl:value-of select="$adjusted-url"/> <xsl:text> </xsl:text> <!-- 递归处理剩余的JSON内容 --> <xsl:call-template name="extract-urls"> <xsl:with-param name="json-content" select="substring-after($after-url-prefix, '"')"/> </xsl:call-template> </xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:template>
注意事项
- 字符串切割方案依赖你当前JSON的固定格式,即
url字段的键值对固定为"url": "xxx"的格式,没有多余空格 - 路径替换用字符串拼接的方式实现,同样匹配固定前缀
/tampilanData/
内容的提问来源于stack exchange,提问作者Rafif Favian
相关产品推荐
相关产品推荐

