XSL获取与元素匹配的值

时间:2013-11-18 19:17:56

标签: xml xslt

我有以下XML片段:

<process>
  <UserAttr>
    <Name>User1</Name>
    <Value>username1</Value>  
    <Name>User2</Name>
    <Value>username2</Value>
    <Name>User3</Name>
    <Value>username3</Value>
    <Name>User4</Name>
    <Value>username4</Value>
  </UserAttr>
</process>

上面的XML是动态的,它可以有更多/更少的Name&amp;价值标签。我希望有一个赋值或转换,这将允许我获得与名称匹配的相应值。

例如,如果我将User1作为参数传递给XSL转换,它应该返回相应的Value,即Username1

我没有发布我的XSL,因为我发布的任何XML都只是我整个XSD的一部分而且我的XSL非常大而且我认为它会非常混乱。

以下是我的XSD外观(这只是来自大型XSD的部分):

<xs:element name="UserAttr" minOccurs="0" maxOccurs="unbounded">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Value" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="Name" type="xs:string"/>
  </xs:complexType>
</xs:element>

我想要执行以下操作,但它会抛出SelectionFailure Fault。我想我需要在XSD中的某处分配数组大小

<assign name="Assign1">
<copy>
<from expression="string('User1')"/>
<to variable="receiveInput_process_InputVariable_3"
part="payload" query="/client:process/UserAttr[position()=1]/@Name"/>
</copy>
<copy>
<from expression="string('User2')"/>
<to variable="receiveInput_process_InputVariable_3"
part="payload" query="/client:process/UserAttr[position()=2]/@Name"/>
</copy>
</assign>

1 个答案:

答案 0 :(得分:1)

假设密钥名称存储在名为keyName的参数中,您可以使用此XPath获取相应的值:

/header/UserAttr/Name[. = $keyName]/following-sibling::*[1][self::Value]

这涉及额外的预防措施,只选择紧跟在Name元素之后的值元素,以防您以某种方式出现这样的格式错误的列表:

<header>
  <UserAttr>
    <Name>User1</Name>
    <Value>username1</Value>  
    <Name>User2</Name>
    <Name>User3</Name>
    <Name>User4</Name>
    <Value>username4</Value>
  </UserAttr>
</header>

因此,如果密钥名称为username4,则上述操作会阻止选择值User 2。如果您不需要额外的预防措施,可以使用:

/header/UserAttr/Name[. = $keyName]/following-sibling::Value[1]

但是,在我看来,如果您能够更改XML结构,则以下任何一项都可以使任务更简单,更清晰。

<header>
  <UserAttr>
    <Attr>
      <Name>User1</Name>
      <Value>username1</Value>  
    </Attr>
    <Attr>
      <Name>User2</Name>
      <Value>username2</Value>
    </Attr>
    <Attr>  
      <Name>User3</Name>
      <Value>username3</Value>
    </Attr>
  </UserAttr>
</header>


<header>
  <UserAttr>
    <Attr name="User1" value="username1" />
    <Attr name="User2" value="username2" />
    <Attr name="User3" value="username3" />
  </UserAttr>
</header>

编辑根据您的XSD,您的XML实际上应该像这样构建:

<something>
  <UserAttr Name="User1">
    <Value>username1</Value>
  <UserAttr>
  <UserAttr Name="User2">
    <Value>username2</Value>
  <UserAttr>
  <UserAttr Name="User3">
    <Value>username3</Value>
  <UserAttr>
</something>

在这种情况下,XPath将是

/something/UserAttr[@Name = $keyName]/Value

为了准确了解/something应该是什么,我们需要查看更多的XSD。