Нужна помощь с XSLT для каждого с использованием XPATH - PullRequest
1 голос
/ 10 июня 2011

Я работаю над проектом, который использует XSLT для преобразования строки HTML для извлечения некоторых конкретных значений. Можете ли вы взглянуть на HTML / XSLT ниже и посмотреть, что я делаю неправильно?

Кстати, в приведенном ниже HTML-коде мне нужно извлечь значение из <a>, которое говорит "что-то" (XPATH = // div [@ id = 'result'] / div [2] / div [1] / a [1 ]):

<html>
    <head></head>
    <body>
        <div>
            <div id="whatever">
                <!--other stuff-->
            </div>
            <div id="whatever2">
                <!--other stuff-->
                <div>
                    <div class='listtable'>
                        <div>
                            <div id="result">
                                <div class="ignore">
                                    <!--other stuff-->
                                </div>
                                <div>
                                    <div>
                                        <a>something</a>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div>
                            <div id="result">
                                <div class="ignore">
                                    <!--other stuff-->
                                </div>
                                <div>
                                    <div>
                                        <a>something</a>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </body>
</html>

Итак, XSLT, который я придумал, выглядит так, но не работает ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
      <html>
      <body>
      <h2>My Link Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Title</th>
          </tr>
          <xsl:for-each select="//div[@id='result']">
          <tr>
            <td><xsl:value-of select="/div[2]/div[1]/a[1]"/></td>
          </tr>
          </xsl:for-each>
        </table>
      </body>
      </html>
    </xsl:template>
    </xsl:stylesheet>

P.S .: Я раньше работал с XPATHS, но у меня нет опыта работы с XSLT, и по какой-то причине происходит сбой Visual Studio при попытке отладки, поэтому я понятия не имею, что здесь пошло не так.

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 10 июня 2011

Важно понимать разницу между Относительными и Абсолютными выражениями XPath.

Абсолютным XPathВыражение начинается с символа «/».

/div[2]/div[1]/a[1]
*1012*

ничего не выбирает, если верхний элемент XML-документа не имеет названия div

С другой стороны, выражения XPath внутри <xsl:for-each> или внутри <xsl:template> чаще всего предназначены для выбора узлов из текущего узла .Для этого они должны быть относительно .

A относительно Выражение XPath никогда не начинается с '/'.

Итак, вВ вашем случае вам нужно иметь :

 div[2]/div[1]/a[1]
2 голосов
/ 10 июня 2011

что я делаю не так?

Это просто маленькая ошибка, которую вы совершаете. XPath должен быть:

"div[2]/div[1]/a[1]"

Таким образом, вы правильно выбираете элементы, начиная с текущего контекста из xsl:for-each. В предоставленном вами способе (с прямой косой чертой в начале XPath) вы пытаетесь выбрать элементы, начинающиеся всегда с корня входного документа.

по какой-либо причине происходит сбой Visual Studio при попытке отладки, поэтому я понятия не имею, что здесь пошло не так.

Если Visual Studio дает сбой, возможно, из-за недостатка. Может быть, вам нужен патч. XSLT, который вы предоставили, верен и никогда не будет зависать с процессором XSLT. Вы должны получить успешный результат также со следующим идентичным преобразованием:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h2>My Link Collection</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Title</th>
                    </tr>
                    <xsl:apply-templates select="//div[@id='result']"/>
                    </table>
                </body>
            </html>
        </xsl:template>

        <xsl:template match="div[@id='result']">
            <tr>
                <td><xsl:value-of select="div[2]/div[1]/a[1]"/></td>
            </tr>
        </xsl:template>

    </xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...