Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 文本节点中的XSL属性表达式表示法_Xslt_Xslt 1.0 - Fatal编程技术网

Xslt 文本节点中的XSL属性表达式表示法

Xslt 文本节点中的XSL属性表达式表示法,xslt,xslt-1.0,Xslt,Xslt 1.0,的值是可怕的。当我需要在文本节点中插入大量变量值时,它确实污染了XSL文件 是否有一种方法可以在输出文本节点内部使用属性表达式表示法,即文本{$variable}?或者至少是比XSLT1.0中没有的值更简洁的东西。但是,在XSLT3.0中,可以使用TVTs()。它们的工作原理与AVTs()相同 要使用TVT,请将标准属性xsl:expand text=“yes”添加到元素中。这将导致处理器将该元素的子代文本节点视为TVT 例如: XSLT 3.0 <xsl:stylesheet versi

的值是可怕的。当我需要在文本节点中插入大量变量值时,它确实污染了XSL文件


是否有一种方法可以在输出文本节点内部使用属性表达式表示法,即
文本{$variable}
?或者至少是比XSLT1.0中没有的
值更简洁的东西。但是,在XSLT3.0中,可以使用TVTs()。它们的工作原理与AVTs()相同

要使用TVT,请将标准属性
xsl:expand text=“yes”
添加到元素中。这将导致处理器将该元素的子代文本节点视为TVT

例如:

XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/*">
        <result xsl:expand-text="yes">
            <value>Value of v1: {v1}</value>
            <value>Value of v2: {v2}</value>
            <value>Value of v3: {v3}</value>
        </result>
    </xsl:template>

</xsl:stylesheet>

这是{$who}的结果:{$what}
输出(使用任何格式良好的XML作为输入)

这是丹的结果:砰!
注:使用Saxon PE 9.5进行测试

下面是一个更好的示例,显示正在计算的“后代”文本节点

XML输入

<test>
    <v1>one</v1>
    <v2>two</v2>
    <v3>three</v3>
</test>
<result>
   <value>Value of v1: one</value>
   <value>Value of v2: two</value>
   <value>Value of v3: three</value>
</result>

一
二
三
XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/*">
        <result xsl:expand-text="yes">
            <value>Value of v1: {v1}</value>
            <value>Value of v2: {v2}</value>
            <value>Value of v3: {v3}</value>
        </result>
    </xsl:template>

</xsl:stylesheet>

v1的值:{v1}
v2的值:{v2}
v3的值:{v3}
输出

<test>
    <v1>one</v1>
    <v2>two</v2>
    <v3>three</v3>
</test>
<result>
   <value>Value of v1: one</value>
   <value>Value of v2: two</value>
   <value>Value of v3: three</value>
</result>

v1值:1
v2值:2
v3值:三
您可以使用concat

<xsl:value-of select="concat(
  'text text ',
  $variable,
  'text text ',  
  $variable,
  'text text'
)" />


这里,输入和所需输出的示例可能非常有用。我建议立即使用命名模板。请看下面的示例:我正要将
concat()
作为1.0/2.0选项添加到我的答案中+1这可能是我的最佳选择。对于XSLT 1.0,它肯定是。存在一个问题。它将文本字符串中的文字换行符解释为空格。有没有一种方法可以避免这些问题?这是因为在解析XSLT脚本时,XML解析的标准规则适用。它们说:属性值中的文字换行符折叠到空间中,字符实体将被解码。因为
select=“…”
首先是一个XML属性。。。(
0xA;
也可以,如果您喜欢十六进制代码的话。)这是我最喜欢的XSLT 3.0功能之一。虽然这很有趣,但不幸的是我被限制在1.0。@Reinderien-这很不幸。@helderdarocha-我同意!我添加了一个更好的示例来说明如何计算子体文本节点。