如何从重复节点获取特定值

时间:2016-10-10 11:27:18

标签: xslt

民间: 请原谅这个新手问题,但请帮助我 -

我正在使用XSL来操作XML中的一些值,如下所示 -

<userFields>
<userField>
   <FieldName>TEST1</FieldName>
   <FieldVal>123</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST2</FieldName>
   <FieldVal>999</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST3</FieldName>
   <FieldVal>756</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST4</FieldName>
   <FieldVal>1234</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
...
</userFields>

我需要为特定的“FieldName”获取FieldVal,比如我需要FieldName为FieldName“TEST2”(在这种情况下为999),我该如何做到这一点呢? Intent是将值存储在变量中,并将其作为XML中的单独用户字段添加,因此结果如下所示:

<userFields>
<userField>
   <FieldName>TEST1</FieldName>
   <FieldVal>123</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST2</FieldName>
   <FieldVal>999</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST3</FieldName>
   <FieldVal>756</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
<userField>
   <FieldName>TEST4</FieldName>
   <FieldVal>1234</FieldVal>
   <Fieldtype>char</Fieldtype>
</userField>
...
</userFields>
<variableX>999</variableX>

我想将TEST2的Fieldval存储在XML中的variableX中。这是因为我可以将此变量作为后续db fetch的参数传递。谢谢。

1 个答案:

答案 0 :(得分:1)

你正在寻找的表达是......

<xsl:variable name="field" select="//userField[FieldName='TEST2']/FieldVal" />

或者,定义一个键来查找元素..

<xsl:key name="userFields" match="userField" use="FieldName" />

然后你可以像这样查找......

<xsl:variable name="field" select="key('userFields', 'TEST2')/FieldVal" />

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:key name="userFields" match="userField" use="FieldName" />
  <xsl:param name="fieldName" select="'TEST4'" />

    <xsl:variable name="field" select="key('userFields', $fieldName)/FieldVal" />

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

  <xsl:template match="userFields">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <variableX>
       <xsl:value-of select="$field" />
    </variableX>
  </xsl:template>
</xsl:stylesheet>

注意我已经制作了&#34; TEST2&#34;一个参数,所以它可以由主应用程序传入。

另请注意使用Identity Template复制现有值。

相关问题