如何通过匹配XPathNodeIterator和XSLT 1.0中的另一个XML的值来设置变量的值?



我们需要通过匹配XPathNodeIterator (String Array的XSLT版本)和XML树的值来设置变量MaterialGroup的值。

XPathNodeIterator有以下数据

<root>
<item>item1</item>
<item>item2</item>
<item>item3</item>
<item>item4</item>
</root>

XML有以下数据:

<MyRoot>
<XrefDescriptionTable>
<value>
<ItemDescription>item0</ItemDescription>
<Group>GroupA</Group>
</value>
<value>
<ItemDescription>item3</ItemDescription>
<Group>GroupB</Group>
</value>
<value>
<ItemDescription>item5</ItemDescription>
<Group>GroupC</Group>
</value>
</XrefDescriptionTable>
</MyRoot>

我们将遍历Item list并尝试在其他XML中找到匹配的ItemDescription。当item和ItemDescription具有相同的值时,对应的Group将是我们的结果。

在给定的示例中,MaterialGroup将输出"GroupB"

注意:-要么只有一个,要么没有匹配情况。

我已经尝试遵循XSLT代码。

<?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"
xmlns:n="http://www.w3.org/2005/Atom"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:cs="urn:cs"
exclude-result-prefixes="msxsl ffs n m d cs"

<xsl:variable name="MaterialGroup" >
<xsl:for-each select="cs:getItemList('item1,item2,item3,item4')"> 
<xsl:if test="/MyRoot/XrefDescriptionTable/value/ItemDescription=current()">
<xsl:value-of select="/MyRoot/XrefDescriptionTable/value[ItemDescription=current()]/Group"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<msxsl:script implements-prefix="my" language="C#">
public XPathNodeIterator getItemList(string itemList)
{
XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
using (XmlWriter writer = doc.DocumentElement.CreateNavigator().AppendChild())
{
foreach (string item in itemList.split(','))
{
writer.WriteElementString("item", item);
}
}
return doc.DocumentElement.CreateNavigator().Select("item");
}
</msxsl:script>

我得到空字符串"而不是" group "作为输出。

我想你应该试试。

<xsl:variable name="items" select="cs:getItemList('item1,item2,item3,item4')"/>

,然后选择

<xsl:variable name="MaterialGroup" select="/MyRoot/XrefDescriptionTable/value[ItemDescription=$items]/Group"/>

这样,如果输入的XML是例如

<MyRoot>
<XrefDescriptionTable>
<value>
<ItemDescription>item1</ItemDescription>
<Group>GroupA</Group>
</value>
<value>
<ItemDescription>item3</ItemDescription>
<Group>GroupB</Group>
</value>
<value>
<ItemDescription>item5</ItemDescription>
<Group>GroupC</Group>
</value>
</XrefDescriptionTable>
</MyRoot>

下面XSLT的结果:

<?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 my"
xmlns:my="http://example.com/mf"
>
<msxsl:script implements-prefix="my" language="C#">
public XPathNodeIterator getItemList(string itemList)
{
XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
using (XmlWriter writer = doc.DocumentElement.CreateNavigator().AppendChild())
{
foreach (string item in itemList.Split(new string[] {","}, StringSplitOptions.None))
{
writer.WriteElementString("item", item);
}
}
return doc.DocumentElement.CreateNavigator().Select("item");
}
</msxsl:script>

<xsl:output method="xml" indent="yes"/>
<xsl:variable name="items" select="my:getItemList('item1,item2,item3,item4')"/>
<xsl:variable name="MaterialGroup" select="/MyRoot/XrefDescriptionTable/value[ItemDescription=$items]/Group"/>

<xsl:template match="/">
<Results>
<xsl:copy-of select="$MaterialGroup"/>
</Results>
</xsl:template>

</xsl:stylesheet>

运行时启用XslCompiledTransform和EnableScript XsltSettings,是:

<Results>
<Group>GroupA</Group>
<Group>GroupB</Group>
</Results>

最新更新