我需要使用 Xsl 从外部 xml 有条件地更改 xml 属性值

I need to change an xml attribute value conditionaly from an external xml using Xsl

我有以下 2 个 xml 个文件,

Mapping.xml

<xml>
    <map ordinal="0" reverse="xxx" forward="ThisIsXxx" />
    <map ordinal="0" reverse="yyy" forward="ThisIsYyy" />
    <map ordinal="0" reverse="zzz" forward="thisIsZzz" />
    <map ordinal="0" reverse="xx1" forward="ThisIsXx1Info" />
    <map ordinal="0" reverse="yy1" forward="ThisIsYy1Info" />
    <map ordinal="0" reverse="zz1" forward="ThisIsZz1Info" />
</xml>

和一个包含一系列元素的输入 xml 文件,其中一些元素具有 'name' 属性

second.xml

<?xml version="1.0" encoding="UTF-8"?>
<xml>
   <Children>
      <child name="xxx">
        <info name="xx1">
        </info>
      </child>
      <child name="yyy">
        <info name="yy1">
        </info>
      </child>
      <child name="zzz">
        <info name="zz1">
        </info>
      </child>
   </Children>     <!-- Added by edit --> 
</xml>

我需要的是,如果方向是 'forward',那么 second.xml 文件 @name 被设置为来自 Mapping.xml 的 @forward 的值,如下所示,

output.xml

<?xml version="1.0" encoding="UTF-8"?>
<xml>
   <Children>
      <child name="ThisIsXxx">
        <info name="ThisIsXx1Info">
        </info>
      </child>
      <child name="ThisIsZzz">
        <info name="ThisIsYy1Info">
        </info>
      </child>
      <child name="ThisIsYyy">
        <info name="ThisIsZz1Info">
        </info>
      </child>
</xml>

我的 Xslt 文件正在设置所有 @name="" 但没有从外部文件中获取任何值..

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  
  <xsl:output method="xml" indent="yes"/>

  <!-- get the mapping db -->
  <xsl:variable name="mapDb" select="document('Mapping.xml')" />
  <xsl:variable name="mapFwd" select="forward" />

  
  <!-- for all @name find the @mapdb/*/@reverse == @name and set @name=@mapDb/*/forward -->
  <xsl:template match="*/@name">
    <xsl:choose>
      <xsl:when test="$mapFwd='forward'">
        <xsl:attribute name="name">
          <xsl:value-of select="$mapDb/xml/map[@reverse='{@name}']/@forward"/>
        </xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:attribute name="name">
          <xsl:value-of select="$mapDb/xml/map[@forward='{@name}']/@reverse"/>
        </xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!--Copy Everything unchanged-->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

非常感谢您的帮助。

我想你想使用 current() 例如$mapDb/xml/map[@reverse=current()] 在匹配 @name 属性的模板中进行比较,当然变量应该用 <xsl:variable name="mapFwd" select="'forward'"/>.

初始化