XSLT / Xpath Выбор элементов на основе значений двух атрибутов - PullRequest
0 голосов
/ 27 февраля 2020

I sh, чтобы вернуть все <nodes>, которые имеют теги с атрибутами k = network & v = LU. Примечание. LU может быть частью строки. Это XML просто возвращает список <tag k="network" v="LU"/>

Если есть какие-либо другие улучшения, которые я могу сделать, обратите внимание на них.

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

  <xsl:template match="osm">
    <xsl:copy>
      <xsl:apply-templates select="node/tag[@k='network' and @v='LU']"/>
    </xsl:copy>
  </xsl:template>

Оригинал XML:

<osm>
   <node>
      <tag k="railway" v="station"/>
      <tag k="network" v="LU"/>
   </node>
   <node>
      <tag k="railway" v="station"/>
      <tag k="network" v="NR"/>
      <tag k="operator" v="LU"/>
   </node>
   <node>
      <tag k="railway" v="station"/>
      <tag k="network" v="NR,LU"/>
      <tag k="operator" v="LU"/>
   </node>
     <...snip...>
</osm>

Желаемый выход

<osm>
   <node>
      <tag k="railway" v="station"/>
      <tag k="network" v="LU"/>
   </node>
   <node>
      <tag k="railway" v="station"/>
      <tag k="network" v="NR,LU"/>
      <tag k="operator" v="LU"/>
   </node>
</osm>

1 Ответ

2 голосов
/ 27 февраля 2020

Правильно ли я считаю, что ваше требование состоит в том, чтобы выбрать и скопировать все элементы <node>, которые имеют дочерний элемент <tag> с атрибутом @k='network' и атрибутом @v, который представляет собой список токенов, включая токен LU?

Я бы сделал это просто как

<xsl:template match="osm">
  <osm>
    <xsl:copy-of select="node[tag[@k='network'][contains(@v,'LU')]]"/>
  </osm>
</xsl:template>

Но тест contains() может потребоваться сделать более точным, например, если может появиться значение типа v="LUCKY". В XSLT 2.0 я бы использовал предикат [tokenize(@v, ',')='LU']

...