2013-07-01 3 views
0

Я пытаюсь отфильтровать XML-файл в приложении .NET, которое я разрабатываю. Некоторые образцы XML ниже, очевидно, не правильный XML, но достаточно близко :-)Фильтр xml в .Net с параметром

<?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, но возвращал только верхушку верхнего уровня. Stylesheet ниже:

<?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> 

Любая помощь или указатели будут оценены!

Благодаря

ответ

0

Это не просыпался, как вы попробовали это, потому что вы не можете иметь выражение XPath в качестве параметра XLST или переменной. Вы можете использовать переменную или параметр в значениях 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]]"> 

Другие варианты были бы be:

  • Исправить XSLT перед его загрузкой
  • Использовать итератор xpath с помощью XPathExpression из .NET.
+0

Спасибо, но это не сработало. Теперь я переработал метод фильтрации данных с помощью объекта Navigator и прокручивал узлы. – GrahamCFNewc

+0

В предложении select было два небольших ошибки. –