我在IE9中打开一个网页 - 然后文档模式突然切换到Quirks模式.页面本身很简单 - 没有doctype,没有元标记,只是形成页面的xslt中的一块(测试目的)javascript.
请在同一位置使用提到的xsl 查看http://home.arcor.de/martin.honnen/xslt/test2012041901.xml.为方便起见,我复制了以下内容.
页面内容是
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test2012041901.xsl"?>
<test/>
Run Code Online (Sandbox Code Playgroud)
并且xsl包含
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:my="http://example.com/my"
exclude-result-prefixes="ms my">
<xsl:output method="html" version="5.0"/>
<ms:script language="JScript" implements-prefix="my">
<![CDATA[
function tokenize (input) {
var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
var fragment = doc.createDocumentFragment();
var tokens = input.split(';');
for (var i = 0, l = tokens.length; i < l; i++)
{
var item = doc.createElement('item');
item.text = tokens[i];
fragment.appendChild(item);
}
return fragment.selectNodes('item');
}
]]>
</ms:script>
<xsl:template match="/">
<html>
<head> …
Run Code Online (Sandbox Code Playgroud) 我熟悉http web服务请求,其中服务所需的参数在url查询部分中提供,例如?parm = 1或?file ="C:\ test.xml".
我现在正在阅读SOAP,我想知道这背后的调用技术是什么:
- 是一个在后台转换为url的SOAP请求(将SOAP xml转换为字符串作为url查询部分的一部分)?
- SOAP请求总是具有等效的URL吗?
- 或者SOAP和http服务请求是否在后台转换为http POST请求?
- 我在哪里可以找到所有这些的好的,澄清的例子?
我正在建立一个SOAP Web服务,它接受XML输入并且必须返回自定义XML输出.所有这些都在WSDL中定义.我为此应用soapServer(直到有人说它有错误阻止我实现我的目标:-)).
我还没有能够返回自定义XML:我得到一些似乎基于WSDL的结果,标准根元素名称等于输入XML加上"响应".实际上,这让我感到惊讶,作为一个侧面问题,我想知道为什么会这样,以及它是否可以受到影响.当然,在创建响应时以某种方式使用WSDL定义是一件好事,但正如我所说,我不知道如何在响应中获得自定义XML.
我得到了这个:
WSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://pse/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
name="PSE"
targetNamespace="http://pse/">
<types>
<xs:schema>
<xs:import namespace="http://pse/" schemaLocation="PSE.xsd"/>
</xs:schema>
</types>
<message name="MI102Req">
<part name="cdhead" type="tns:cdhead_T"/>
<part name="instr" type="tns:instr_T"/>
</message>
<message name="Res">
<part name="cdhead" type="tns:cdhead_T"/>
</message>
<portType name="MIPortType">
<operation name="mi102">
<input message="tns:MI102Req"/>
<output message="tns:Res"/>
</operation>
</portType>
<binding name="MIBinding" type="tns:MIPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="mi102">
<soap:operation soapAction="http://www.testURL/test_soap.php#mi102"/>
<input>
<soap:body use="literal" namespace="http://pse/"/>
</input>
<output>
<soap:body use="literal" namespace="http://pse/"/>
</output>
</operation>
</binding>
<service name="PSE">
<port name="MIPortType" binding="tns:MIBinding">
<soap:address location="http://www.testURL/test_soap.php"/>
</port>
</service>
</definitions>
Run Code Online (Sandbox Code Playgroud)
输入XML …
我有一个XSLT,其中(从输入数据中)创建中间变量,如下所示(硬编码示例,但本质上是动态的):
<xsl:variable name="variableX">
<ValidCode CodePart="CP1" Code="C1"/>
<ValidCode CodePart="CP2" Code="C2"/>
<ValidCode CodePart="CP1" Code="C3"/>
<ValidCode CodePart="CP2" Code="C4"/>
<ValidCode CodePart="CP2" Code="C5"/>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)
我希望遍历CodePart值的不同出现。在XSLT 2.0中,这很容易:
<xsl:for-each select="distinct-values($variableX/ValidCode/@CodePart)">...</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
但是,如何在XSLT 1.0中做到最好呢?
请注意,我不能使用键,因为它是动态确定的变量,而不是输入文件的一部分。
我的输入文件确实包含所有可能的代码部分的列表,如下所示:
<root>
<CodePart><value>CP1</value></CodePart>
<CodePart><value>CP2</value></CodePart>
<CodePart><value>CP3</value></CodePart>
</root>
Run Code Online (Sandbox Code Playgroud)
所以我想到了循环//CodePart/value
,以确保初学者的独特性。但是然后我需要一些包含条件的Xpath表达式
“值出现在所有$ variableX / ValidCode / @ CodePart值的节点集中”
并使用类似
<xsl:for-each select="//CodePart[..condition..]/value">...</xsl:for-each>
Run Code Online (Sandbox Code Playgroud)
我正在寻找Xpath表达式的简单形式吗?
还是其他方法更可取?
我正在使用<
Xpath 1.0中的字符串来解决运算符问题.
这个简单的Xpath表达式
'A' < 'B' (or the equivalent 'A' < 'B')
Run Code Online (Sandbox Code Playgroud)
我在libxslt(这是一个XSLT 1.0引擎)的xslt运行中没有评估为true.
我检查了XML Spy,它允许在1.0和2.0中测试Xpath表达式,果然,在Xpath 2.0中它的计算结果为true
,但在Xpath 1.0中它的计算结果为false
!
这是Xpath 1.0中的错误吗?
我应该使用什么其他表达式来比较两个字符串/字符的字母顺序?请注意,compare()函数不会这样做,因为这是一个XSLT 2.0函数.
回答另一个线程(参见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) 我在 Windows 7 笔记本电脑上安装了 EasyPhp(版本 5.3.9)并尝试使用包含的 phpMyAdmin 模块(从 easyPhp 管理主页中选择),但我无法登录 - 我收到以下错误:
#1045 - Access denied for user 'root'@'localhost' (using password: NO)
我根本没有更改任何文件 - 所以它应该只使用 user=root 而没有密码,我假设。
我检查了 SO 中的其他线程,但找不到任何适用的解决方案。我还尝试完全卸载 easyPhp 并重新安装它,但是同样的问题,即使按照其中一个线程的建议清除所有浏览器缓存也是如此。
接下来做什么?当我什至无法进入管理工具时,如何在 EasyPhp 中使用 MySQL 模块?
我有一个 ms access vba 代码,我希望将一些文本值复制到 Windows 剪贴板,以便我可以将其粘贴到其他地方(Word/Excel/记事本/等)。
我一直在寻找这个,但一切似乎都过于复杂。难道不应该是简单的事情吗
剪贴板.SetText 文本值
?
编辑
我尝试按照 BrianMStafford 的提示进行操作,但没有成功。也许原因是我的对象是树中的一个节点。当我做
MsgBox Me.NodeKey.Value
一切正常 - 我在消息框中看到节点路径。
但当我这样做时
Me.NodeKey.SetFocus
DoCmd.RunCommand acCmdCopy
我在剪贴板中没有获取节点路径
那么如何将节点路径值复制到Windows剪贴板中呢?
我在这里的第一篇文章 - 肯定希望有人知道答案!我已经能够为我遇到的许多问题找到解决方案,但对于这个问题却没有.关于同一主题的本网站上的问题和答案并没有解决我的问题......
我有一个包含格式规范的xml
<Format>
<TagNr>92</TagNr>
<Option>A</Option>
<Format>//[N]15d</Format>
</Format>
<Format>
<TagNr>92</TagNr>
<Option>B</Option>
<Format>//3!a/3!a/15d</Format>
</Format>
Run Code Online (Sandbox Code Playgroud)
TagNr +选项是此节点集中的唯一组合.
我定义了一个键,使得使用这组格式变得更容易:
<xsl:key name="xx" match="//Format/Format" use="concat(../TagNr, ../Option)"/>
Run Code Online (Sandbox Code Playgroud)
我确实可以使用这个键并获得正确的值,但仅限于非特殊元素; 我在以下每个或其他结构中使用此键时出现错误"XPath 2.0表达式中的错误不是节点项".
我尝试实现的目标如下:在处理的其他节点中,有一系列选项,我希望为每个字符检索格式.例如:
<Tag>
<TagNr>92</TagNr>
<Options>AB</Options>
</Tag>
Run Code Online (Sandbox Code Playgroud)
我一直在尝试下面的很多变种,但没有运气:
<xsl:variable name="TN"><xsl:value-of select="TagNr"/></xsl:variable>
<xsl:variable name="optList">
<xsl:analyze-string select="./Options" regex="[A-Z]">
<xsl:matching-substring>
<xsl:variable name="TNO" select="concat($TN, .)"/>
<opt>
<tag><xsl:value-of select="$TNO"/></tag>
<fmt><xsl:value-of select="key('xx', $TNO)"/></fmt>
</opt>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)
使用正则表达式分割成单个字符很顺利,并且(仅)检索(仅)opt/tag的值也很好.但是当我添加opt/fmt时,我遇到了上面提到的Xpath表达式的错误消息select ="key('xx',$ TNO)".
我尝试根据此站点上另一个线程中建议的键函数定义变量,但没有成功.
谁能帮我?
我在XSLT处理器的行为上遇到了一些特殊的差异.我想知道这背后的原因是什么,以及处理器差异是否有完整的概述.
我测试了以下简单转换(使用虚拟输入):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>1=
2=
3=
4=

end</xsl:text>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
在XML Spy(v 2011 sp1 x64)中运行,输出为:
1=
2=
3=
4=
end
Run Code Online (Sandbox Code Playgroud)
在所有情况下,在十六进制之后=
和之后的行中4=
,添加了两个字符,0D
并且0A
.显然,XML间谍会替换每个请求&xA;
或&xD;
完整的CR + LF事件,除非按顺序请求CR和LF,相互之后(参见3 =部分).
但是当在saxon9he中运行时,我得到一个警告,我正在运行带有v2.0处理器的v1.0样式表,输出是
1=
2=3=
4=
end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,所有请求&xA;
都被替换为0D 0A
(因此在LF前面添加CR),但是请求&xD;
输出所请求的CR,而不是额外的LF.
在XML中重新运行间谍设置XSLT版本为2.0会产生与1.0相同的结果,所以我想这两个XSLT版本中的不同之处就是导致这种情况.
最有可能的是,这只是我们必须了解的工具之间的差异,但我想知道是否还有更多关于这个问题的说法.
xslt ×5
php ×2
soap ×2
xpath ×2
xslt-1.0 ×2
browser ×1
clipboard ×1
easyphp ×1
httprequest ×1
key ×1
msxml ×1
mysql ×1
node-set ×1
phpmyadmin ×1
quirks-mode ×1
saxon ×1
soapserver ×1
vba ×1
web-services ×1
xslt-2.0 ×1