0

我正在尝试在我正在开发的 .Net 应用程序中过滤 xml 文件。下面的一些示例 xml,显然不是正确的 xml,但足够接近:-)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Row A1="1" A2="AMS">
    <Name>Ashley</Name>
    <Team>Team B</Team>
    <Date>3/25/2012</Date>
    <Value>511681.15</Value>
</Row>
<Row A1="2" A2="AMS">
    <Name>Kylie</Name>
    <Team>Team A</Team>
    <Date>9/28/2010</Date>
    <Value>408438.47</Value>
</Row>
<Row A1="3" A2="AMS">
    <Name>Gianna</Name>
    <Team>Team B</Team>
    <Date>40004</Date>
    <Value>109709.22</Value>
</Row>
<Row A1="4" A2="AMS">
    <Name>Chase</Name>
    <Team>Team F</Team>
    <Date>40152</Date>
    <Value>279018.79</Value>
</Row>

样式表有一个由应用程序中的 XsltArgumentList 设置的参数。参数被传递到样式表中,但不过滤 xml。我尝试使用 ms 节点集和 exsl 节点集,但只返回顶级根。下面的样式表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" indent="yes" encoding="UTF-8" />
<xsl:decimal-format name="NN" NaN="0" />
<xsl:param name="Filter"  />
<xsl:template match="/">
    <Root>
        <xsl:for-each select="exsl:node-set($Filter)">
            <Row>
                <xsl:attribute name="A1">
                    <xsl:value-of select="@A1" />
                </xsl:attribute>
                <xsl:attribute name="A2">
                    <xsl:value-of select="@A2" />
                </xsl:attribute>
                <Team>
                    <xsl:value-of select="Team"/>
                </Team>
            </Row>
        </xsl:for-each>
    </Root>
</xsl:template>

我试图通过的过滤器可以使用 xml 元素的任何组合。当前正在尝试的过滤器如下

<xsl:param name="Filter" select="//Row[Team='Team A']" />

但这只是回报

<?xml version="1.0" encoding="utf-8"?>
<Root>
<Row A1="" A2="">
<Team></Team>
</Row>
</Root>

任何帮助或指示将不胜感激!

谢谢

4

1 回答 1

0

这不会像您尝试的那样唤醒,因为您不能在 XLST 参数或变量中使用 xpath 表达式。您可以在 const 值中使用变量或参数。

因此你可以使用类似的东西

<xsl:param name="teamFilter" select="'Team A'" />
...
 <xsl:for-each select="//Row[Team='$teamFilter']">

或者,如果您必须过滤不同的节点,您可以尝试:

<xsl:param name="filterValue" select="'Team A'" />
<xsl:param name="filterNode" select="'Team'" />

...

<xsl:for-each select="//Row[*[name()= $filterNode and . =$filterValue]]">

其他选择是:

  • 在加载 XSLT 之前对其进行修补
  • 将 xpath 迭代器与 .NET 中的 XPathExpression 结合使用。
于 2013-07-01T09:02:44.373 回答