据我所知,querySelector
返回一个真正的可更改元素,同时querySelectorAll
返回一个非实时静态节点集.
我想调整适合特定选择器的所有元素的样式.它适用于第一个元素querySelector
,但不适用于所有匹配元素querySelectorAll
.我猜那是因为节点集是非实时的.
有解决方法吗?或者我错过了什么?
请帮帮我们.我只是想声明一个简单的结果树片段并迭代它.
...
<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>
Run Code Online (Sandbox Code Playgroud)
...
我完全错误地认为这是如何工作的?
编辑: 我正在使用.NET XslCompiledTransform并具有正确的msxsl名称空间声明 - xmlns:msxsl ="urn:schemas-microsoft-com:xslt"
转换执行得很好 - 问题是什么都没有输出
回答另一个线程(参见stackoverflow:生成css颜色方案)我遇到了下面的问题,其中不同的xsl引擎似乎需要不同的方法将结果树片段转换为节点集.
简化问题(但请参阅上面的链接以了解此背后的完整故事),我希望有一个包含颜色值列表的内联树.由于必须在Xpath表达式中使用,我必须专门为MSXML xx xsl引擎创建一个节点集(内置的XML Spy在解释构造为rtf的变量的Xpath表达式时遇到的麻烦较少).
另一个线程stackoverflow:automating-exsltnode-set帮助我.生成的节点集用于从输入XML创建新变量rtf.
同样,MSXML在Xpath表达式中使用新变量时会抱怨,所以我使用了node-set函数从中创建了一个节点集.
到目前为止一直很好,MSXML xx不再出错.
但是当我在XML Spy内置或Saxon 9he中运行相同时,我得到另一个错误:似乎节点集函数未知:
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set() in variable colorList
Run Code Online (Sandbox Code Playgroud)
请注意,在这个特定的例子中不需要这种两步法,但正如我所说的,我简化了一些事情; 我只想知道如何编写一个适用于所有xsl引擎的XSLT 1.0转换.
我使用的XSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:std="http://whatever"
xmlns:exslt="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="std exslt">
<xsl:output method="xml" indent="yes"/>
<std:colors>
<color>#0000FF</color>
<color>#FF0000</color>
</std:colors>
<xsl:variable name="colors" select="document('')/*/std:colors"/>
<xsl:variable name="std:colorList">
<xsl:for-each select="//testid">
<xsl:variable name="pos" select="position() mod 2"/>
<xsl:element name="color">
<xsl:attribute name="testid"><xsl:value-of select="."/></xsl:attribute>
<xsl:value-of select="$colors/color[$pos + 1]"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="colorList" select="exslt:node-set($std:colorList)"/>
<xsl:template match="/">
<output>
<xsl:copy-of …
Run Code Online (Sandbox Code Playgroud) 我正在尝试保留我的xsl DRY,因此我想为XML文档的2个部分调用相同的模板,这些部分碰巧是相同的复杂类型(ContactDetails和AltContactDetails).给出以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<RootNode>
<Name>Bob</Name>
<ContactDetails>
<Address>
<Line1>1 High Street</Line1>
<Town>TownName</Town>
<Postcode>AB1 1CD</Postcode>
</Address>
<Email>test@test.com</Email>
</ContactDetails>
<AltContactDetails>
<Address>
<Line1>3 Market Square</Line1>
<Town>TownName</Town>
<Postcode>EF2 2GH</Postcode>
</Address>
<Email>bob@bob.com</Email>
</AltContactDetails>
</RootNode>
Run Code Online (Sandbox Code Playgroud)
我写了一个XSL样式表,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<PersonsName>
<xsl:value-of select="RootNode/Name"/>
</PersonsName>
<xsl:call-template name="ContactDetails">
<xsl:with-param name="data"><xsl:value-of select="RootNode/ContactDetails"/></xsl:with-param>
<xsl:with-param name="elementName"><xsl:value-of select="'FirstAddress'"/></xsl:with-param>
</xsl:call-template>
<xsl:call-template name="ContactDetails">
<xsl:with-param name="data"><xsl:value-of select="RootNode/AltContactDetails"/></xsl:with-param>
<xsl:with-param name="elementName"><xsl:value-of select="'SecondAddress'"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="ContactDetails">
<xsl:param name="data"></xsl:param>
<xsl:param name="elementName"></xsl:param>
<xsl:element name="{$elementName}">
<FirstLine>
<xsl:value-of select="$data/Address/Line1"/>
</FirstLine>
<Town>
<xsl:value-of select="$data/Address/Town"/>
</Town>
<PostalCode>
<xsl:value-of …
Run Code Online (Sandbox Code Playgroud) 当我有这两个变量
<xsl:variable name="a" select="'Total'" />
<xsl:variable name="b" select="'500'" />
Run Code Online (Sandbox Code Playgroud)
我想创建一个名为变量'a'的节点及其变量'b'的内容.我必须使用xsltproc和XSLT 1.0以及一些EXSLT扩展(其中包含节点集),所以我已经实现了它的一部分:
<xsl:template match="/">
<xsl:variable name="x" >
<<xsl:value-of select="$a" />>
<xsl:value-of select="$b" />
</<xsl:value-of select="$a" />>
</xsl:variable>
<xsl:value-of disable-output-escaping="yes" select="$x" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
确实推出了这个(我暂时不关心空白):
<?xml version="1.0"?>
<Total>
500
</Total>
Run Code Online (Sandbox Code Playgroud)
但是:我想使用变量'x'作为节点集来进一步操作它(当然我的现实生活中的例子更复杂).我所做的是将其转换为节点集(使用exslt.org/common),这似乎有效但访问内容却没有.
<xsl:variable name="nodes" select="common:node-set($x)" />
<xsl:value-of select="$nodes/Total" />
Run Code Online (Sandbox Code Playgroud)
没有任何结果.因为$ nodes/Total应该是一个有效的XPATH 1.0表达式,我本来期望' 500 '.显然我错过了一些东西.我想重点是动态创建节点名称<...>
并不真正创建一个节点而只是一些文本输出,那么我如何在这里实现真正的节点创建?
的Icecast包含基于一个XSLT实现的libxslt从xmlsoft。
我想知道它是否支持node-set()函数,最好以一种也适用于其他纯网络环境的方式:
遗憾的是,icecast 中的XSLT 处理器只能通过icecast 进程的Web 界面进行Web 访问(因此命令行上没有xsltproc)。更糟糕的是:XSLT 错误的日志记录有限(当你做错事时,icecast 进程通常会死掉)。
我正在运行 icecast 2.3.2,因为它是基于 Windows的最新版本(目前还没有用于 Windows 的 2.3.3 版本),其中 libxslt.dll 的日期是 2008 年。DLL 中没有版本号,我是最好的可以提供的是这个(见底部的 XSLT 代码):
Version: 1.0
Vendor: libxslt
Vendor URL: http://xmlsoft.org/XSLT/
Run Code Online (Sandbox Code Playgroud)
我尝试运行David Carlisle 的博客文章“如何以独立于平台的方式使用节点集功能? ”指向的 EXSLT 节点集功能中提到的节点集检测。
从输出来看,我认为失败了:
icemaster@localhost972990localhost00EarthIcecast 2.3.2Sun, 23 Jun 2013 20:02:19 W. Europe Daylight Time202200ice-samplerate=44100;ice-bitrate=64;ice-channels=264StationGenre6424410000http://localhost:8000.....
Run Code Online (Sandbox Code Playgroud)
通过 Web 界面中的 XSL 文件进行查找的最佳方法是什么?
版本脚本:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" encoding="UTF-8" …
Run Code Online (Sandbox Code Playgroud) 我有以下XSLT样式表(简化):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="categories">
<category name="one"/>
<category name="two"/>
<category name="three"/>
</xsl:variable>
<xsl:template match="/">
<result>
<xsl:for-each select="exsl:node-set($categories)/category">
<xsl:element name="{@name}">
<!-- THIS IS THE PROBLEMATIC PART -->
<xsl:for-each select="/input/object">
<item>
<xsl:value-of select="."/>
</item>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
这是指以下源XML文档(也简化):
<?xml version="1.0" encoding="utf-8"?>
<input>
<object category="one">a</object>
<object category="one">b</object>
<object category="two">c</object>
<object category="one">d</object>
<object category="three">e</object>
</input>
Run Code Online (Sandbox Code Playgroud)
对源文档的引用不会产生任何结果; 输出只是空元素,每个类别一个:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<one/>
<two/>
<three/>
</result>
Run Code Online (Sandbox Code Playgroud)
如何使用源文档中的项目"填充"元素?
只是为了澄清,使用不同的方法已经解决了这背后的"真正"问题.我只是想了解为什么这种方法不起作用.