小编Mar*_*nen的帖子

XSLT使用属性选择不同的值

我正在尝试使用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中完成它?

谢谢

xslt select unique distinct

8
推荐指数
1
解决办法
2万
查看次数

XSLT3 可以在与 expand-text=yes 相同的模板中使用禁用输出转义吗?

我注意到在 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">&lt;test/&gt;</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">&lt;test/&gt;</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>&lt;test/&gt;</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 saxon xslt-3.0

6
推荐指数
1
解决办法
176
查看次数

是应该将xs:double转换为xs:decimal实现为BigDecimal.valueOf(double)还是new BigDecimal(double)?

与XSLT和XPath 2.0及更高版本共享的XQuery支持各种数字数据类型,其中两种是xs:doublexs: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.1new BigDecimal(1.1)导致1.100000000000000088817841970012523233890533447265625.

当我尝试的演员xs:doublexs: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,哪种方法是实施演员操作的正确方法?

java xquery saxon exist-db basex

5
推荐指数
1
解决办法
674
查看次数

如果命名空间也被定义为默认值,则强制XDocument不使用命名空间前缀

我有一个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文件是由另一方提供的,我需要做尽可能少的修改.

c# xml namespaces linq-to-xml

5
推荐指数
1
解决办法
418
查看次数

VBA 与 XSLT 可以在同一行中漂亮地打印带有结束标记的 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)

xml xslt vba msxml

4
推荐指数
1
解决办法
605
查看次数

如何在.NET中使用Saxon-HE 9.8使用XSLT 3.0

我正在使用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)

c# xslt saxon xslt-3.0

3
推荐指数
1
解决办法
2834
查看次数

是否有记录的通用基类?

在 .NET 类型系统中,所有引用类型都来自System.ObjectSystem.ValueType我认为所有值类型都来自。是否还有一个所有record类型都派生自的公共基类?如果没有,为什么不呢?

c# c#-9.0

3
推荐指数
1
解决办法
336
查看次数

tokenize($ s)与tokenize($ s,'')是否相同?

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&#10;2&#10;3'))使用Saxon或BaseX或XmlPrime时,我得到3 3count(tokenize('1 2 3', ' ')), count(tokenize('1&#10;2&#10;3', ' '))所有这三种实现中的等效功能3 1

因此,这三个实现似乎都与tokenize($s)文字说明所说的一致(“将提供的字符串在空格边界处分割”),但是,如果在字面上传递了一个空格,那么似乎并没有满足规范中给定的fn:tokenize($input)fn:tokenize(fn:normalize-space($input), ' '))仅将单个空格用作分隔符,而不是空白边界。

规范中作为单参数版本的定义给出的等效性是否错误?

xslt-3.0 xpath-3.1 xquery-3.1

2
推荐指数
1
解决办法
33
查看次数

使用 fn:random-number-generator 多次产生随机数

我尝试编写一个简单的函数,每次调用它时都会为我提供一个随机字母,但是我很难将我的想法与函数式编程方法的概念结合起来。沿途的一些帮助将不胜感激!我的代码看起来像:

<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)

xslt xslt-3.0

2
推荐指数
1
解决办法
614
查看次数

Is there any known issue with OpenJDK 8 (1.8.0_232) and some HTTPS connections causing HTTP error 403?

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)

java xquery saxon basex

2
推荐指数
1
解决办法
1150
查看次数

xslt 3.0 和 xpath3.1 的数组和映射示例

我想在 XPath3.1 中使用新功能,例如arraymap,这听起来像是一个 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)

因此,它有一个简单,工作代码,可以证明的力量arraymap?谢谢!

c# xslt xpath xslt-3.0 xpath-3.1

1
推荐指数
1
解决办法
3426
查看次数

如何从命令行运行 Saxon

任何人都可以发布详细的分步说明,说明如何安装 Saxon (10 HE) 以及如何从 MacOS (10.13.6) 中的命令行运行转换?

我已经在我的电脑上安装了Java。
我已经SaxonHE10-6J.zip从 SourceForge 下载了该文件。
根据此处的建议,我已将其放入文件夹saxon-he-10.6.jarmyUserName/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 个文件路径(并且可能为转换添加一些选项)。

我需要做什么?

java xslt macos command-line saxon

0
推荐指数
1
解决办法
4091
查看次数