【问题标题】:XSL for each on the xml being transformed inside a for each of parmxml 上的每个 XSL 被转换为每个 parm
【发布时间】:2012-11-28 13:44:08
【问题描述】:

我有以下 xml

  <root>
      <element id='1'>blah</element>
      <element id='2'>blah</element>
      <element id='3'>blah</element>
  </root>

传入我的 xsl 的参数是..

  <Ids>
      <id>1</id>
      <id>2</id>
      <id>3</id> 
  </Ids>

在我的 xsl 中,我想遍历 parm 和 xml 以匹配具有等于 parm id 值之一的 id 属性的任何元素。这是动态的,我不知道它们的值将是 uuid。

我已经尝试过了,但我找不到元素 id

  <xsl:for-each  select="/$Ids/id">
 <xsl:variable name="driverId" select="."/>
     <xsl:for-each select="/root/element[@id=$driverId]">
          //do something
     </xsl:for-each>
   </xsl:for-each>

如果在第一个 for each 之前将元素 id 的值发送出去,我可以看到所有值,但在循环中看不到。这是否可能以我正在考虑的方式进行。

还是不行,我改成
结果相同。

如果我把 for-each 放在参数之外,则在 xsl 中

  <test><xsl:for-each select="/root/element/@id"></test>

我明白了

  <test>1 2 3</test>

如果放

  <test><xsl:for-each select="/root/element/@id"></test>

里面

   <xsl:for-each  select="$Ids/id">

我什么也没得到???

【问题讨论】:

    标签: xml xslt xml-parsing xslt-1.0 xslt-2.0


    【解决方案1】:

    定义一个键

    <xsl:key name="id" match="element" use="@id"/>
    

    那么您还需要使用全局xsl:variable 来引用主输入文档,即

    <xsl:variable name="main-root" select="/"/>
    

    一旦你有了那个用途

    <xsl:for-each select="$Ids//id">
      <xsl:for-each select="key('id', ., $main-root)">...</xsl:for-each>
    </xsl:for-each>
    

    没有钥匙,你需要

    <xsl:for-each select="$Ids//id">
      <xsl:for-each select="$main-root/root/element[@id = current()]">...</xsl:for-each>
    </xsl:for-each>
    

    【讨论】:

    • 我尝试了“无”版本...仍然是同样的问题我现在将尝试密钥
    • 谢谢,Martin 设置了变量并且密钥起作用了!!!我能够使用我的“内部”变量 driverId 来保留 id 的实例,以便在第二个中为每个和子字符串使用。
    【解决方案2】:
    <xsl:for-each  select="/$Ids/id">
    

    显然不正确:

    /$Ids 在语法上不合法——变量/参数引用不能立即跟在/ 运算符之后。

    正确的表达方式是:

    $Ids/id
    

    而你真正想要的是:

    /root/element[@id=$Ids/id]
    

    【讨论】:

    • 我可以在没有 "/" 的情况下以这种方式获取 $IDs 的值。我从 java 发送 parm 作为 document.getDocumentElement()
    • @JustinCox,好的,然后从我的答案中的表达式中删除 /Ids -- 我也会更新它。
    • 我的问题是正在转换的 xml 似乎我失去了对 parm 的每个循环中的“/root/element[@id=$driverId]”的引用,这是否有意义你。谢谢
    • @JustinCox,如果您使用此分析器中的表达式,则不存在此问题:&lt;xsl:for-each="/root/element[@id=$Ids/id]"/&gt;
    • 我更新了我尝试更改表达式的问题,但即使在第一个参数中的元素属性的简单打印中,我也没有得到任何结果(即使没有尝试等于id)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2016-07-18
    • 2015-06-14
    • 2018-10-30
    相关资源
    最近更新 更多