如何将属性值更改为前面的同级值

  • 本文关键字:前面 属性 xslt xslt-1.0
  • 更新时间 :
  • 英文 :


>我有一个特定的要求,我需要用前面的同级节点值更改当前元素的属性值。

当前 XML

<com:row>
<com:new>
    <com:Component ExcludeInd="false">
        <com:CatTypeCode>35</com:CatTypeCode>
        <com:SubCatTypeCode>055508</com:SubCatTypeCode>
        <com:ComCode>1000</com:ComCode>
        <com:VComponentCode>nbr</com:VComponentCode>
        <com:Val Value="sometext">250</com:Val>
    </com:Component>
</com:new>
</com:row>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:com="http://www.w3.org/2001/XMLSchema-instance">
   <xsl:output method="xml" indent="yes"/>
    <xsl:template match="../com:Component/com:Val">
          <xsl:element name="com:Val" namespace="http://www.w3.org/2001/XMLSchema-instance">
          <xsl:variable name="myVar" select="preceding-sibling::com:VComponentCode"/>
            <xsl:attribute name="ValueType"><xsl:value-of select="$myVar"/></xsl:attribute>     
             <xsl:apply-templates select="@*|node()"/>
          </xsl:element>
       </xsl:template>
</xsl:stylesheet>

预期的 XML

<com:row>
<com:new>
    <com:Component ExcludeInd="false">
        <com:CatTypeCode>35</com:CatTypeCode>
        <com:SubCatTypeCode>055508</com:SubCatTypeCode>
        <com:ComCode>1000</com:ComCode>
        <com:VComponentCode>nbr</com:VComponentCode>
        <com:Val Value="nbr">250</com:Val>
    </com:Component>
</com:new>
</com:row>

当我对值进行硬编码时,我可以更改属性中的值,但不能作为变量。

假设您有一个格式正确的 XML 输入,则可以尝试以下 XSL 转换:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:com="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
  <xsl:template match="com:Val/@Value">
    <xsl:attribute name="Value">
      <xsl:value-of select="parent::com:Val/preceding-sibling::com:VComponentCode"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

简要说明 :

  • <xsl:template match="@* | node()">:标识模板。此模板将匹配的元素和属性复制到源 XML 中的输出 XML。

  • <xsl:template match="com:Val/@Value">:覆盖com:Val元素Value属性的身份模板。此模板不会复制属性以输出,而是创建新的Value属性,其值取自前面的同级元素com:VComponentCode

相关内容

  • 没有找到相关文章

最新更新