XSLT从元素更改为属性格式

时间:2018-03-21 19:06:20

标签: xslt

更改此XML的XSLT是什么

<?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_ELEMENT VALUE="440" TYPE="ADD1" />
</cas:ADDRESS_DETAILS>

采用此格式

<?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" ADD2 ="McMurchy" PROV="ON" COUNTRY="CA" CITY="Brampton" ADD1="440">
</cas:ADDRESS_DETAILS>

1 个答案:

答案 0 :(得分:2)

假设您要将所有ADDRESS_ELEMENT合并到其父级中,您可以使用

  <xsl:template match="ADDRESS_ELEMENT[1]">
      <xsl:copy>
          <xsl:apply-templates select="../ADDRESS_ELEMENT" mode="to-attribute"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="ADDRESS_ELEMENT[position() > 1]"/>

  <xsl:template match="ADDRESS_ELEMENT" mode="to-attribute">
      <xsl:attribute name="{@TYPE}" select="@VALUE"/>
  </xsl:template>

加上身份转换以处理其余部分(即XSLT 3中的<xsl:mode on-no-match="shallow-copy"/>https://xsltfiddle.liberty-development.net/6qM2e2q)或早期版本中的相应模板)

如果要将子元素转换为父元素的属性,正如编辑似乎表明的那样,您可以简化代码。但是,使用命名空间需要进行一些调整:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xpath-default-namespace="http://example.com/cas"
    version="3.0">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="ADDRESS_DETAILS">
      <xsl:copy>
          <xsl:apply-templates select="@*, ADDRESS_ELEMENT"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="ADDRESS_ELEMENT">
      <xsl:attribute name="{@TYPE}" select="@VALUE"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/6qM2e2q/2

相关问题