我正在使用XSLT将XML转换为HTML.
我有以下XML结构:
<root>
<element>
<subelement>
This is some html text which should be <span class="highlight">displayed highlighted</span>.
</subelement>
</element>
</root>
Run Code Online (Sandbox Code Playgroud)
我使用以下模板进行转换:
<xsl:template name="subelement">
<xsl:value-of select="." />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
不幸的是,我失去了<span>-tags.
有没有办法保留它们以便正确显示HTML(突出显示)?
我的文件base.css包含:
ol > li { color: red; }
Run Code Online (Sandbox Code Playgroud)
我尝试读取它并使用XSLT 2.0未解析文本(Saxon 9.1.0.2J)将其渲染到我的HTML输出中,如下所示:
<style>
<xsl:sequence select="unparsed-text(fn:iri-to-uri($CSS-BASE-FILE))"/>
</style>
Run Code Online (Sandbox Code Playgroud)
但是,unparsed-text()函数将'>'转换为'>' 在HTML中,像这样:
<style>
ol > li { color: red; }
</style>
Run Code Online (Sandbox Code Playgroud)
...哪个不像"ol> li"那样.
如何使用XSLT将'>'字符渲染到我的元素中?我尝试过使用replace(...,'>','>'),但仍会呈现'>' 进入HTML.
或者,是否有另一种方法可以指定CSS子选择器而无需在我的HTML中嵌入文字">"字符?
如果$ A和$ B是序列,那么测试$ A和$ B的集合平等的首选方法是什么?我知道存在的语义行为($A = $B)使得这个表达不是答案.排序语义也deep-equal()禁止我使用它.
我的冲动是使用:
((every $a in $A satisfies $a = $B) and (every $b in $B satisfies $b = $A))
Run Code Online (Sandbox Code Playgroud)
我发现通过谷歌进行集合平等测试的确很少(确切地说,我发现什么都没有),我没有在@ Michael-Kay的第8章,第9章,第10章或第13章中看到它.我很难相信我是第一个遇到这种需求的XPath用户.这让我想知道我是否提出了错误的问题.
在http://perldoc.perl.org/perlrun.html对Perl -i[extension]功能的描述中,与以下程序实质上相同的代码作为"等效"使用:perl -pi.orig ...
#!/usr/bin/perl
use strict;
use warnings;
my $extension = '.orig';
my $oldargv = '';
my $backup;
LINE: while (<>) {
if ($ARGV ne $oldargv) {
if ($extension !~ /\*/) {
$backup = $ARGV . $extension;
} else {
($backup = $extension) =~ s/\*/$ARGV/g;
}
rename($ARGV, $backup);
open(ARGVOUT, ">$ARGV");
select(ARGVOUT);
$oldargv = $ARGV;
}
# Don't change anything; just copy.
}
continue {
print;
}
select(STDOUT);
Run Code Online (Sandbox Code Playgroud)
这个工作正常$extension eq '.orig'; 但是,Perl也定义-i了没有扩展名(也就是for …
我的目标是有一个--override=f选项来操纵其他两个选项的值.诀窍是解决如何参考选项的值(匹配部分f中=f的标志符)sub的是执行的时候GetOptions检测在命令行上的选项的存在.
我是这样做的:
$ cat t.pl
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
our %Opt = (
a => 0,
b => 0,
);
our %Options = (
"a=f" => \$Opt{a},
"b=f" => \$Opt{b},
"override=f" => sub { $Opt{$_} = $_[1] for qw(a b); }, # $_[1] is the "trick"
);
GetOptions(%Options) or die "whatever";
print "\$Opt{$_}='$Opt{$_}'\n" for keys %Opt;
$ t.pl --override=5
$Opt{a}='5'
$Opt{b}='5'
$ t.pl --a=1 --b=2 --override=5 --a=3
$Opt{a}='3'
$Opt{b}='5' …Run Code Online (Sandbox Code Playgroud) 我无法理解为什么 XSLT(Saxon 9.1 和 9.5)在使用包含排序序列的变量时以这种方式工作。
这是我的程序的输出,其中嵌入了我的三个问题:
<?xml version="1.0" encoding="UTF-8"?>
The following sequence is unsorted...
sequence $list = (<contribution e="4"/><contribution e="1"/><contribution e="2"/><contribution e="8"/>)
It is, as I expected, in document order.
The following sequence is explicitly sorted...
sequence $sorted-list = (<contribution e="8"/><contribution e="4"/><contribution e="2"/><contribution e="1"/>)
It is, as I expected, sorted in descending numerical @e order.
In the following output, I expect for the @e values from $list to be in document order,
and for the @e values from $sorted-list to …Run Code Online (Sandbox Code Playgroud) 我想在表达式中使用哈希.没问题:
use strict;
use warnings;
my %h = (a=>1, b=>2);
my $h = $h{a};
print "h='$h'\n";
Run Code Online (Sandbox Code Playgroud)
但由于我只提到它一次,我不想命名它.天真地用哈希内容替换$ h不起作用.以下代码在"){"的第3行产生语法错误:
use strict;
use warnings;
my $x = (a=>1, b=>2){a};
print "x='$x'\n";
Run Code Online (Sandbox Code Playgroud)
我知道以下是实现我需要的方法:
use struct;
use warnings;
my $y = {a=>1, b=>2}->{a};
print "y='$y'\n";
Run Code Online (Sandbox Code Playgroud)
为什么第二个例子不起作用?
编辑1:这是一个MVCE.在现实生活中,我的哈希键(本例中为'a')不是常量.
编辑2:关于我的动机更多一点:我不想在我的代码中使用不必要的变量范围,所以如果我将%h的范围限制在它真正属于的范围,我会这样:
use strict;
use warnings;
my $h;
{
my %h = (a=>1, b=>2);
$h = $h{a};
}
print "h='$h'\n";
Run Code Online (Sandbox Code Playgroud)
我不想将%h留在范围内以获得比我需要的代码更多的代码,但是使用额外的块来编写代码段也很笨拙.这就是为什么我正在寻找一种干净的单行方式来完成任务.
#!/usr/bin/perl
use strict;
use warnings;
my $s = "1234567890.123456789";
{
no bignum; printf "bignum==%s\n", bignum::in_effect() // 0;
my $x = $s;
printf "%29s\n", $x;
printf "%29.9f\n\n", $x;
}
{
use bignum; printf "bignum==%s\n", bignum::in_effect() // 0;
my $x = $s;
printf "%29s\n", $x;
printf "%29.9f\n\n", $x;
}
Run Code Online (Sandbox Code Playgroud)
使用%f转换的My Perl的printf(为darwin-thread-multi-2level构建的ActiveState v5.10.1)不会使我的值超过1e-6数字,即使使用bignum:
$ t.pl
bignum==0
1234567890.123456789
1234567890.123456717
bignum==1
1234567890.123456789
1234567890.123456717
Run Code Online (Sandbox Code Playgroud)
如何在不丢失精度的情况下打印输入?
我真正的问题是我需要操纵这个数字(例如,$ x/0.000_000_001,或者更糟糕的是,$ x/0.000_001_024,我不能用substr()函数调用来伪装),但是在我能够进入"有趣"部分之前,目前的减少让我感到难过.