XSL msxsl:node-set problem

情到浓时终转凉″ 提交于 2019-12-01 17:36:01

问题


Please help me out guys. I'm just trying to declare a simple result tree fragment and iterate over it.


...

<xsl:variable name="rtf">
  <item-list>
    <item id="1">one</item>
    <item id="2">two</item>
    <item id="3">three</item>
    <item id="4">four</item>
  </item-list>
</xsl:variable>

<xsl:for-each select="msxsl:node-set($rtf)/item-list/item">
  <xsl:value-of select="@id"/>
</xsl:for-each>

...


Am I completely mistaken about how this works?


Edit: I'm using .NET XslCompiledTransform and have the correct msxsl namespace declarations - xmlns:msxsl="urn:schemas-microsoft-com:xslt"

The transformating executes fine - the problem is that nothing is output


回答1:


My suspicion is that you have a default namespace declared in your stylesheet. That would effectively place the <item-list> and <item> elements into a namespace. To select namespace-qualified elements using XPath 1.0, you must always use a prefix in the expression.

So if you have something like this at the top of your stylesheet:

<xsl:stylesheet xmlns="http://example.com"...>

Then you'll need to also add this:

<xsl:stylesheet xmlns="http://example.com" xmlns:x="http://example.com"...>

And then use the "x" prefix in your XPath expression:

<xsl:for-each select="msxsl:node-set($rtf)/x:item-list/x:item">
  <xsl:value-of select="@id"/>
</xsl:for-each>

Let me know if that did the trick. I'm only speculating here.




回答2:


Unlike MSXSL, XslCompiledTransform provides node-set() function where it is supposed to be - in EXSLT Common namespace:

<xsl:stylesheet xmlns:exslt="http://exslt.org/common">
  ...
  <xsl:for-each select="exslt:node-set($rtf)/item-list/item">
  ...
</xsl:stylesheet>



回答3:


This looks OK to me.

Have you correctly declared the msxsl namespace for the extension functions though? Something like this:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">

I am assuming you are using the Microsoft XSLT processor here



来源:https://stackoverflow.com/questions/1859839/xsl-msxslnode-set-problem

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!