我有以下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>
答案 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。