【问题标题】:XSLT change from elements to attribute formatXSLT 从元素到属性格式的变化
【发布时间】:2018-03-21 19:06:19
【问题描述】:

什么是 XSLT 来改变这个 XML

<?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>

【问题讨论】:

  • 这至少部分取决于上下文,即如果您在一个共同的父级中有几个 ADDRESS_ELEMENT 元素并且想要将它们全部合并在一起,或者您是否只想合并这些元素,如果它们是相邻元素。因此,您可能想向我们展示更多背景信息。

标签: xslt


【解决方案1】:

假设您想将所有 ADDRESS_ELEMENTs 合并到您可以使用的父级中

  <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 中的 &lt;xsl:mode on-no-match="shallow-copy"/&gt; (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

【讨论】:

  • 嗨马丁...我已经澄清了查询..你能告诉我正确的方法吗。
  • 您已经改变了问题,现在希望将元素转换为父元素的属性。而且您在 cas:ADDRESS 中引入了一个前缀,它没有命名空间声明。但我会编一个。
猜你喜欢
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多