如何编写XSLT将XML元素转换为属性格式?
解决XML中
<cas:ADDRESS_ELEMENT>转属性格式的XSLT方案 嘿,这就给你搞定!下面的XSLT代码可以完美实现你要的需求——把每个<cas:ADDRESS_ELEMENT>元素的TYPE属性作为新的属性名,VALUE属性作为对应的值,合并到父元素<cas:ADDRESS_DETAILS>中,同时保留原元素的所有原有属性:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cas="http://your-namespace-here.com"> <!-- 替换成XML中cas前缀对应的实际命名空间URI --> <!-- 匹配根节点,触发文档处理 --> <xsl:template match="/"> <xsl:apply-templates select="cas:ADDRESS_DETAILS"/> </xsl:template> <!-- 核心处理逻辑:转换ADDRESS_DETAILS元素 --> <xsl:template match="cas:ADDRESS_DETAILS"> <!-- 复制当前元素的标签结构 --> <xsl:copy> <!-- 保留原元素的所有已有属性 --> <xsl:copy-of select="@*"/> <!-- 遍历所有ADDRESS_ELEMENT子元素,转换为属性 --> <xsl:for-each select="cas:ADDRESS_ELEMENT"> <!-- 动态生成属性:属性名取TYPE的值,属性值取VALUE的值 --> <xsl:attribute name="{@TYPE}"> <xsl:value-of select="@VALUE"/> </xsl:attribute> </xsl:for-each> <!-- 若需保留ADDRESS_DETAILS下的其他子元素,取消下面一行注释即可 --> <!-- <xsl:apply-templates select="*[not(self::cas:ADDRESS_ELEMENT)]"/> --> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键注意事项
- 命名空间配置:必须把代码里的
http://your-namespace-here.com替换成原XML中cas前缀对应的真实命名空间URI(原XML头部应该有这个声明,只是你提供的片段没显示),否则XSLT无法正确匹配元素。 - 重复TYPE处理:如果存在多个
TYPE值相同的<cas:ADDRESS_ELEMENT>,后面的元素会覆盖前面的属性值(XSLT默认行为),如果需要合并重复值,可以额外添加拼接逻辑。 - 其他子元素保留:如果原XML中
<cas:ADDRESS_DETAILS>还有非ADDRESS_ELEMENT的子元素需要保留,取消代码末尾的注释行即可。
输入输出示例
输入片段
<?xml version="1.0" encoding="utf-8"?> <cas:ADDRESS_DETAILS PRIMARY_ADDRESS_INDICATOR="1" ADDRESS_ID="-289495914026885120" ADDRESS_TYPE="45001" ADDRESS_ACTIVE_FROM_DATE="2006-12-23" PERSON_ID="14512823342202880"> <cas:ADDRESS_ELEMENT VALUE="McMurchy Avenue" TYPE="ADD2" /> <cas:ADDRESS_ELEMENT VALUE="ON" TYPE="PROV" /> <cas:ADDRESS_ELEMENT VALUE="CA" TYPE="COUNTRY" /> <cas:ADDRESS_ELEMENT VALUE="Brampton" TYPE="CITY" /> </cas:ADDRESS_DETAILS>
输出片段
<cas:ADDRESS_DETAILS PRIMARY_ADDRESS_INDICATOR="1" ADDRESS_ID="-289495914026885120" ADDRESS_TYPE="45001" ADDRESS_ACTIVE_FROM_DATE="2006-12-23" PERSON_ID="14512823342202880" ADD2="McMurchy Avenue" PROV="ON" COUNTRY="CA" CITY="Brampton"/>
内容的提问来源于stack exchange,提问作者MDAS
相关产品推荐
相关产品推荐

