XSLT/Xpath根据两个属性的值选择元素

XSLT/Xpath根据两个属性的值选择元素,xslt,xpath-2.0,Xslt,Xpath 2.0,我希望返回所有带有属性k=network&v=LU的标签的。注意LU可能是字符串的一部分。此XML仅返回 如果有任何其他改进,请注意 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates sele

我希望返回所有带有属性k=network&v=LU的标签的
。注意LU可能是字符串的一部分。此XML仅返回

如果有任何其他改进,请注意

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

我认为您的要求是选择并复制所有
元素,这些元素具有属性
@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”
的值。对于XSLT2.0,我将使用谓词
[tokenize(@v',,')='LU']

我认为您的要求是选择并复制所有
元素,这些元素具有属性
@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”
的值。对于XSLT2.0,我将使用谓词
[tokenize(@v,,')='LU']

请指出您可以使用哪个版本的XSLT。它通常会影响答案。请指出您可以使用哪个版本的XSLT。它通常会影响答案。问题答案:是的。我花了点时间才意识到“contains”缺少了一个结束括号,但现在它可以做到这一点&我能找到的所有其他示例,都是对上层元素(osm)进行硬编码。有没有可能使它对任何标签都通用?您可以使用
。在其内部,使用
更正。很高兴你在上面搔了搔头;我讨厌人们不停地理解代码片段。@JoelM.Lamsen我能请你澄清/检查一下吗,因为我正在努力让它工作。元素应该有正斜杠还是正斜杠?许多在线示例使用“本地名称”。这在这种情况下合适吗?
匹配是否正确?@DaveF您显然需要掌握一些文档:您正在努力,因为您正试图通过反复试验使其工作。问题答案:是的。我花了点时间才意识到“contains”缺少了一个结束括号,但现在它可以做到这一点&我能找到的所有其他示例,都是对上层元素(osm)进行硬编码。有没有可能使它对任何标签都通用?您可以使用
。在其内部,使用
更正。很高兴你在上面搔了搔头;我讨厌人们不停地理解代码片段。@JoelM.Lamsen我能请你澄清/检查一下吗,因为我正在努力让它工作。元素应该有正斜杠还是正斜杠?许多在线示例使用“本地名称”。这在这种情况下合适吗?
匹配是否正确?@DaveF您显然需要掌握一些文档:您正在苦苦挣扎,因为您正试图通过反复试验使其正常工作。