我正在尝试使用XSLT将列表转换为不同的值列表.
输入:
<object name="obj1"/>
<object name="obj2"/>
<object name="obj1"/>
Run Code Online (Sandbox Code Playgroud)
期望的输出:
<object>obj1</object>
<object>obj2</object>
Run Code Online (Sandbox Code Playgroud)
有人知道如何在XSLT 1.0或2.0中完成它?
谢谢
我注意到在 Saxon 的 XSLT3 中尝试使用禁用输出转义时,如果在样式表或什至在给定的匹配模板上将扩展文本设置为 yes,它将不起作用
以下代码(在其自身上运行时)显示了该问题(在 Saxon 9.8.0.12 中)。我知道这是一个不寻常的组合,并且通常不惜一切代价避免禁用输出转义,而只是试图确定正确的行为。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:template match="/">
<out>
<xsl:apply-templates/>
</out>
</xsl:template>
<xsl:template match="xsl:stylesheet" expand-text="true">
<expandtext>
<count>{count(*)}</count>
<xsl:text disable-output-escaping="true"><test/></xsl:text>
</expandtext>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="xsl:template" expand-text="false">
<notexpandtext>
<count>{count(*)}</count>
<xsl:text disable-output-escaping="true"><test/></xsl:text>
</notexpandtext>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
产生
<?xml version="1.0" encoding="UTF-8"?>
<out>
<expandtext><count>3</count><test/></expandtext>
<notexpandtext><count>{count(*)}</count><test/></notexpandtext>
<notexpandtext><count>{count(*)}</count><test/></notexpandtext>
<notexpandtext><count>{count(*)}</count><test/></notexpandtext>
</out>
Run Code Online (Sandbox Code Playgroud) 与XSLT和XPath 2.0及更高版本共享的XQuery支持各种数字数据类型,其中两种是xs:double
和xs:decimal
.如http://www.w3.org/TR/xquery-operators/#casting-to-numerics中所定义,可以转换xs:double
为an .xs:decimal
在Java中完成的实现似乎xs:double
使用Java double
数据类型并xs:decimal
使用java.math.BigDecimal
类来实现.该类支持两种将a转换double
为a的方式BigDecimal
,即do BigDecimal.valueOf(doubleValue)
和new BigDecimal(doubleValue)
.据/sf/answers/503040891/,前者给出了更直观的结果,而后者给出了更准确的结果,例如BigDecimal.valueOf(1.1)
导致1.1
而new BigDecimal(1.1)
导致1.100000000000000088817841970012523233890533447265625
.
当我尝试的演员xs:double
到xs:decimal
与撒克逊和存在,那么
xquery version "1.0";
let $d1 as xs:double := 1.1E0
return xs:decimal($d1)
Run Code Online (Sandbox Code Playgroud)
输出1.100000000000000088817841970012523233890533447265625
,同时用BaseX它输出1.1
.我认为差异来自不同的实现,BaseX做BigDecimal.valueOf(1.1)
,Saxon和Exist new BigDecimal(1.1)
.
我的问题是:根据http://www.w3.org/TR/xquery-operators/#casting-to-numerics,哪种方法是实施演员操作的正确方法?
我有一个xml文件,默认命名空间使用和不使用名称空间前缀.当我生成xml输出时,我得到所有xml元素前缀.有没有办法摆脱前缀,因为我使用默认命名空间?
class Program
{
static void Main(string[] args)
{
var xml =
"<root xmlns='default-namespace' xmlns:key='default-namespace'>" +
" <node1></node1>" +
" <node2></node2>" +
"</root>";
var document = XDocument.Parse(xml);
var output = document.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
<key:root xmlns="default-namespace" xmlns:key="default-namespace">
<key:node1></key:node1>
<key:node2></key:node2>
</key:root>
Run Code Online (Sandbox Code Playgroud)
我期待的是:
<root xmlns="default-namespace" xmlns:key="default-namespace">
<node1></node1>
<node2></node2>
</root>
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法删除重复的名称空间声明.我正在使用的实际xml文件是由另一方提供的,我需要做尽可能少的修改.
<Root ID="123" Name="Board">
<Element1 name="AAA"/>
<Element2 name="BBB"/>
<Element3 name="CCC"/>
<Element4 name="DDD" Age="56" Address="78"/>
<Nested_Elements>
<Nested Number="125"/>
<Nested Number="250"/>
<Nested Number="500"/>
<Nested Number="1000"/>
</Nested_Elements>
</Root>
Run Code Online (Sandbox Code Playgroud)
我编写了 VBA 代码来导出 XML 并使用 XSLT 样式通过添加以下内容来漂亮地打印它
Set xslDoc = New MSXML2.DOMDocument
xslDoc.LoadXML "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>" _
& "<xsl:stylesheet version=" & Chr(34) & "1.0" & Chr(34) _
& " xmlns:xsl=" & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _
& " <xsl:strip-space elements=" & Chr(34) & "*" & Chr(34) …
Run Code Online (Sandbox Code Playgroud) 我正在使用Win7,并将VSC#项目设置为.NETFramework4。然后下载SaxonHE9-8-0-7N-setup.exe并安装。然后将saxon9he-api.dll引用到C#项目中,using Saxon.Api;
这是我的program.cs
:
static void Main(string[] args)
{
var xslt = new FileInfo(Path.GetFullPath(Path.Combine(Environment.CurrentDirectory.ToString(), @"..\..\..")) + @"\TEST.xslt");
var input = new FileInfo(Path.GetFullPath(Path.Combine(Environment.CurrentDirectory.ToString(), @"..\..\..")) + @"\TEST.xml");
var output = new FileInfo(Path.GetFullPath(Path.Combine(Environment.CurrentDirectory.ToString(), @"..\..\..")) + @"\result.txt");
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(new Uri(xslt.FullName));
var transformer = executable.Load();
var serializer = new Serializer();
FileStream outStream = new FileStream(output.ToString(), FileMode.Create, FileAccess.Write);
serializer.SetOutputStream(outStream);
using (var inputStream = input.OpenRead())
{
transformer.SetInputStream(inputStream, new Uri(Path.GetTempPath()));
transformer.SetParameter(new QName("password"), new XdmAtomicValue("secret"));
transformer.Run(serializer); …
Run Code Online (Sandbox Code Playgroud) 在 .NET 类型系统中,所有引用类型都来自System.Object
,System.ValueType
我认为所有值类型都来自。是否还有一个所有record
类型都派生自的公共基类?如果没有,为什么不呢?
https://www.w3.org/TR/xpath-functions/#func-tokenize说明有关的单参数版本tokenize
:
此函数的单参数形式在空白边界处分割提供的字符串。
然后继续定义或解释
调用
fn:tokenize($input)
等效于fn:tokenize(fn:normalize-space($input), ' '))
在第二个参数是单个空格字符(x20)的情况下调用
但是,当我尝试count(tokenize('1 2 3')), count(tokenize('1 2 3'))
使用Saxon或BaseX或XmlPrime时,我得到3 3
了count(tokenize('1 2 3', ' ')), count(tokenize('1 2 3', ' '))
所有这三种实现中的等效功能3 1
。
因此,这三个实现似乎都与tokenize($s)
文字说明所说的一致(“将提供的字符串在空格边界处分割”),但是,如果在字面上传递了一个空格,那么似乎并没有满足规范中给定的fn:tokenize($input)
和fn:tokenize(fn:normalize-space($input), ' '))
仅将单个空格用作分隔符,而不是空白边界。
规范中作为单参数版本的定义给出的等效性是否错误?
我尝试编写一个简单的函数,每次调用它时都会为我提供一个随机字母,但是我很难将我的想法与函数式编程方法的概念结合起来。沿途的一些帮助将不胜感激!我的代码看起来像:
<xd:doc>
<xd:desc>Provides one random letter, if the type is provided it returns a letter of thet type</xd:desc>
<xd:param name="type">The type of letter to return, one of (A,a,B,b)</xd:param>
</xd:doc>
<xsl:function name="gdpr:randomLetter" as="xs:string">
<xsl:param name="type" as="xs:string"></xsl:param>
<xsl:choose>
<xsl:when test="$type = 'A'">
<xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 7)[1]"/>
<xsl:variable name="letters" select="('A','O','U','E','I','Y','Q')"/>
<xsl:value-of select="$letters[$randomNumber]"/>
</xsl:when>
<xsl:when test="$type = 'a'">
<xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 7)[1]"/>
<xsl:variable name="letters" select="('a','o','u','e','i','y','q')"/>
<xsl:value-of select="$letters[$randomNumber]"/>
</xsl:when>
<xsl:when test="$type = 'B'">
<xsl:variable name="randomNumber" select="random-number-generator()['next']?permute(1 to 19)[1]"/>
<xsl:variable name="letters" select="('W','R','T','P','S','D','F','G','H','J','K','L','M','N','B','V','C','X','Z')"/>
<xsl:value-of select="$letters[$randomNumber]"/> …
Run Code Online (Sandbox Code Playgroud) When running Saxon 9.9.1.6 HE with Java 1.8.0_232 (java -version
outputs
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.232-b09, mixed mode)
Run Code Online (Sandbox Code Playgroud)
) and the command line java -cp 'C:\Program Files\Saxonica\Saxon9.9HE\saxon9he.jar' net.sf.saxon.Query -t .\harry-potter-api-ex1.xq
to run an XQuery program trying to access https://www.potterapi.com/v1/sortingHat I always get an error FOUT1170: Server returned HTTP response code: 403 for URL: https://www.potterapi.com/v1/sortingHat
.
Running Java 12.0.1 (java -version
output
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build …
Run Code Online (Sandbox Code Playgroud) 我想在 XPath3.1 中使用新功能,例如array
和map
,这听起来像是一个 googleable 问题,但我尝试了许多示例代码仍然收到错误消息,这是我到目前为止的方法:
<!-- XSLT.xslt -->
<!-- using SaxonHE9-8-0-7 -->
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="system-property('xsl:version ')"/> <!-- show 3.0 -->
<xsl:copy-of select="system-property('xsl:vendor ')"/> <!-- show Saxonica -->
<xsl:copy-of select="system-property('xsl:xpath-version')"/> <!-- show 3.1 -->
<xsl:copy-of select="system-property('xsl:xsd-version ')"/> <!-- show 1.1 -->
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
因此,它有一个简单,工作代码,可以证明的力量array
和map
?谢谢!
任何人都可以发布详细的分步说明,说明如何安装 Saxon (10 HE) 以及如何从 MacOS (10.13.6) 中的命令行运行转换?
我已经在我的电脑上安装了Java。
我已经SaxonHE10-6J.zip
从 SourceForge 下载了该文件。
根据此处的建议,我已将其放入文件夹saxon-he-10.6.jar
中 myUserName/Library/Java/Extensions
。然后我打开终端应用程序并输入基于此答案的
命令:
java -jar saxon-he-10.6.jar -'/Users/myUserName/Documents/path/to/mystylesheet.xsl' -s:'/Users/myUserName/Documents/path/to/some.xml'
Run Code Online (Sandbox Code Playgroud)
这导致:
Unable to access jarfile saxon-he-10.6.jar
Run Code Online (Sandbox Code Playgroud)
我的所有尝试(包括将 .jar 文件移动到/Library/Java/Extensions
目录或在命令中包含 .jar 文件的完整路径)都失败了,并出现相同的错误消息。
请注意,我不是 Java 开发人员,我不打算在应用程序中使用它。我想要的只是能够偶尔进行一次转变。
我还应该注意,XML 和 XSLT 文件的位置可能会因情况而异。我希望能够将 .jar 文件保留在恒定位置,并根据需要提供 XML 和 XSLT 文件的路径 - IOW,我想要一个命令模板,我只需要更改 2 个文件路径(并且可能为转换添加一些选项)。
我需要做什么?