XSLT/Xpath根据两个属性的值选择元素
我希望返回所有带有属性k=network&v=LU的标签的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
。注意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您显然需要掌握一些文档:您正在苦苦挣扎,因为您正试图通过反复试验使其正常工作。