2016-10-10 71 views
0

民间: 这个新手的问​​题,请借口,但请你帮我 -如何从一个中继节点获取一个特定值

我使用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> 

我需要获得FieldVal特定“字段名”,说我需要为FieldVal字段名“TEST2”(在这种情况下是999),我怎么做到这一点吗? 意图是将值存储在一个变量,并将其添加为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存储在variableX内XML。这是如此,因为我可以传递这个变量作为后续分贝获取的参数。谢谢。

回答

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> 

注意我已经将“TEST2”作为参数,所以它可以通过主应用程序传入。

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

+0

感谢您的回答蒂姆。但是,如果我稍微调整了一下要求,并希望将值赋给变量selectedval?它会是这样的 - – zephyr

+0

用你的“调整”的要求来编辑你的问题可能会更好。谢谢! –

+0

谢谢蒂姆,我按照建议编辑过,欢呼声。 – zephyr

相关问题