Как написать предикат, соответствующий символу доллара? - PullRequest
2 голосов
/ 29 января 2010

С учетом следующего документа:

<foo>
  <object>
    <property name="value">    <!-- MATCH THIS NODE -->
      <string>alpha</string>
    </property>
    <property name="name">
      <string>$A$</string>
    </property>
  </object>
  <object>
    <property name="value">
      <string>bravo</string>
    </property>
    <property name="name">
      <string>$B$</string>
    </property>
  </object>
</foo>

и таблица стилей, основанная на преобразовании идентичности:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- HAVING PROBLEMS HERE -->
  <xsl:template match="property[@name='value'][../property[@name='name']/string='$A$']">
    Replace with text!
  </xsl:template>

</xsl:stylesheet>

Какие предикаты я бы использовал, если я хочу сопоставить узел, указанный в исходном документе, когда мне нужно отключить содержимое элемента свойства / строки sibling (строка $ A $)?

Ответы [ 3 ]

1 голос
/ 29 января 2010

Попробуйте это:

propery[@name='value' and ../property[@name='name' and string = '$A$']]
1 голос
/ 29 января 2010

Я не уверен, достаточно ли это универсально для ваших нужд, но это должно приблизить вас:

property[following-sibling::property[1]/string = '$A$']

Это соответствует узлу свойство , в котором у следующего свойства брата есть дочерний элемент строка , где текст равен "$ A $"

Это должно работать, если у вас один и тот же шаблон с двумя узлами свойств, но его нужно будет скорректировать, если в вашем XML больше узлов свойств.

0 голосов
/ 01 февраля 2010

Для полноты, XPath "сверху вниз":

/foo/object[property[@name='name']='$A$']/property[@name='value']

Хотя структура XML, подобная следующей, имела бы гораздо больше смысла:

<foo>
  <object>
    <property name="$A$">
      <string>alpha</string>
    </property>
  </object>
  <object>
    <property name="$B$">
      <string>bravo</string>
    </property>
  </object>
</foo>

потому что вы могли бы сделать

/foo/object/property[@name='$A$']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...