【问题标题】:XSLT if matching all XML tag contentsXSLT 如果匹配所有 XML 标记内容
【发布时间】:2016-01-17 17:26:12
【问题描述】:

问题:给定一个xml文件,使用xslt获取值为'sam'的content/id标签的值

问题:匹配相同路径的所有值都被选中。布赖恩和山姆。

(我想知道 select 应该选择第一个匹配项,而不应该像 xslt 中提供的 for-each 实用程序那样循环)

xml

<?xml version="1.0" encoding="UTF-8"?>
<Primary>
  <PID>Tech1</PID>
  <Version>1234</Version>
  <AData>
      <Id>widnows</Id>
 </AData>
 <BData>
   <Content>
      <Id>brian</Id>
   </Content>
   <Content>
      <Id>sam</Id>
   </Content>
 </BData>
</Primary>`

xslt

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  <xsl:template match="/Primary">
    <xsl:variable name="var" select="'sam'" />
     <xsl:apply-templates select="BData/Content">
         <xsl:if test="Id='sam'">
         <xsl:value-of select="Id"/>
         </xsl:if>
    </xsl:apply-templates>
  </xsl:template>
</xsl:stylesheet>

【问题讨论】:

  • "使用 xslt 获取值为 'sam' 的 content/id 标签的值" 值为'sam'content/id 标签的值为'sam'。您不需要任何 XSLT 即可知道这一点。
  • 这是进一步处理的初步选择。保持问题陈述简单,以免显得复杂。

标签: xml xslt


【解决方案1】:

您当前有一个 xsl:if 语句作为 xsl:apply-templates 的子级,这在 XSLT 中是不允许的。如果只想选择Id值为“sam”的Content元素,可以将条件放在apply-templates的select属性中,像这样

<xsl:apply-templates select="BData/Content[Id='sam']" />

试试这样的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  <xsl:template match="/Primary">
     <xsl:variable name="var" select="'sam'" />
     <xsl:apply-templates select="BData/Content[Id=$var]" />
  </xsl:template>

  <xsl:template match="Content">
      <xsl:value-of select="Id" />
  </xsl:template>
</xsl:stylesheet>

编辑:方括号内的表达式不必只是等于,它可以是任何有效的表达式,例如,如果您只想要 Content 元素,其 Id 以“sam”或“bob”开头,你会这样做:

 <xsl:apply-templates select="BData/Content[starts-with(Id, 'sam') or starts-with(Id, 'bob')]" />

【讨论】:

  • 非常感谢。它有帮助。但这不是直接匹配。我可以添加像starts_with() 和逻辑运算符这样的字符串方法,而不仅仅是[Id= $var]。基本上任何在标签中传递给“测试”的东西。
  • 好吧,如果你想要一个问题的答案,首先你必须问这个问题,而你问的问题是如何“获取值为'sam'的内容/id标签的值”。 ...话虽如此,在回复您的评论时,您确实可以在这里使用更复杂的表达式。我已经修改了我的答案以显示一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-25
  • 1970-01-01
  • 2018-07-08
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多