xslt 相关问题

XSLT是XML的一种转换语言,旨在将结构化文档转换为其他格式(如XML,HTML和纯文本,或者在XSLT 3,JSON中)。问题应该根据需要使用xslt-1.0,xslt-2.0或xslt-3.0标记之一。

在XSLT中创建元素时有没有办法添加带有命名空间的属性?

我正在尝试使用另一个文件创建一个 XSLT 文件, 1.0 我正在尝试使用另一个 XSLT 文件创建一个 XSLT 文件, <xsl:element name="xsl:stylesheet"> <xsl:attribute name="version">1.0</xsl:attribute> <xsl:attribute name="xmlns:msxsl">urn:schemas-microsoft-com:xslt</xsl:attribute> <xsl:attribute name="xlink">http://www.w3.org/1999/xlink</xsl:attribute> <xsl:attribute name="exclude-result-prefixes">msxsl</xsl:attribute> <xsl:apply-templates select="Root"/> </xsl:element> 第二个属性有一个命名空间“xmlns”,它会抛出错误:前缀未定义。 没有第三个属性 xlink 中的命名空间,它也可以正常工作。 那么如何指定命名空间呢? 谢谢你 您无法使用 xsl:attribute 创建名称空间节点,因为在 XSLT 数据模型中,名称空间和属性是不同的东西。 在结果树中创建命名空间节点有多种方法: (a) 如果您从源树复制一个元素(例如使用 <xsl:copy-of/>),那么它的命名空间也会被复制。 (b) 如果您在样式表中编写文字结果元素(例如 <thing xmlns:z="http://z/"/> 那么它的命名空间也会被复制,即使它们没有在任何元素或属性名称中使用。 (c) 如果使用 xsl:element 构造元素,则元素名称或其属性名称中使用的任何命名空间将通过称为命名空间修复的过程自动出现在结果树中。 (d) 从 XSLT 2.0 开始,有一个 xsl:namespace 指令供上述所有方法失败时使用。 您没有说明您正在使用哪个版本的 XSLT,这始终是一个错误,但由于您的代码提到了 msxsl 那么我猜它可能是旧版 XSLT 1.0。如果是这样的话,我认为你有两个选择: (1) 将文字结果元素与 xsl:namespace-alias 一起使用 - 在规范和其他地方有很多这样的示例。 (2) 创建一个结果树片段,如下所示: <xsl:variable name="dummy"> <msxml:dummy xmlns:msxml="..."/> </xsl:variable> 然后使用 <xsl:copy-of select="exslt:node-set($dummy)//namespace::*"/> 将其命名空间复制到最终结果树中

回答 1 投票 0

如何将多个XSL文件合并为一个?

我将 XSL 文件组织为树结构,并使用 xsl:import 指令继承。开发起来非常方便。但为了向后兼容,我需要生成一个平面 XSL fi...

回答 1 投票 0

如何过滤源 XML,然后将结果再次作为 XML 传递以正常处理

我有一个 xslt 和 xml 处理工作流程,其中文档从根匹配开始处理,然后触发各种其他处理元素。我现在需要采用相同的工作流程并注入...

回答 1 投票 0

xml 分页转置事务排序数据在 xslt2 中显示为 html 表

得到相同的旧(无序)xml数据文件(这次有7条“记录”)... 180 <

回答 1 投票 0

查找彼此相邻的兄弟节点

我有一个巨大的 xml 和 xsl,在转换它时遇到一些错误。我想知道如果两个子节点在父节点内彼此相邻,则调用适当的 templ...

回答 1 投票 0

xslt:键与 contains(text(),

我必须使用 xslt 1.0 并且我有以下 xml: 短 客户端、运行时、语言 <

回答 1 投票 0

如何使用 XSLT 合并两个相似的 XML 文件?

我有两个结构相似的 XML 文件。需要使用 XSLT 将这些 xml 文件合并为一个。 01.xml(有两个引用REF01和REF10) 我有两个结构相似的 XML 文件。需要使用 XSLT 将这些 xml 文件合并为一个。 01.xml(有两个引用 REF01 和 REF10) <?xml version="1.0" encoding="utf-8" standalone="yes"?> <common-indicators> <common-indicator> <reference>REF01</reference> <name>name1</name> <reports> <report> <id>15</id> <name>name15</name> </report> <report> <id>16</id> <name>name16</name> </report> </reports> </common-indicator> <common-indicator> <reference>REF10</reference> <name>name10</name> <reports> <report> <id>30</id> <name>name30</name> </report> <report> <id>32</id> <name>name32</name> </report> <report> <id>34</id> <name>name34</name> </report> </reports> </common-indicator> </common-indicators> XSLT 转换(包括 xml 文件作为 param1 与两个引用 REF02 和 REF10 合并): <xsl:param name="param1"> <common-indicators> <common-indicator> <reference>REF02</reference> <name>name2</name> <reports> <report> <id>17</id> <name>name17</name> </report> <report> <id>18</id> <name>name18</name> </report> </reports> </common-indicator> <common-indicator> <reference>REF10</reference> <name>name10</name> <reports> <report> <id>36</id> <name>name36</name> </report> <report> <id>38</id> <name>name38</name> </report> <report> <id>40</id> <name>name40</name> </report> </reports> </common-indicator> </common-indicators> </xsl:param> <xsl:variable name="updateItems" select="$param1/common-indicators/common-indicator" /> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="common-indicators"> <xsl:copy> <xsl:apply-templates select="common-indicator" /> <xsl:apply-templates select="$updateItems" /> </xsl:copy> </xsl:template> XSLT 3.0 引入了合并功能。 这是一个为您提供的概念示例。 List1.xml <?xml version="1.0"?> <list> <item id="1"> <descr ref="a"/> <descr ref="b"/> </item> <item id="2"> <descr ref="c"/> <descr ref="d"/> </item> <item id="3"> <descr ref="e">one</descr> <descr ref="f">one</descr> </item> </list> List2.xml <?xml version="1.0"?> <list> <item id="4"> <descr ref="z"/> <descr ref="y"/> </item> </list> XSLT 3.0 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math" version="3.0"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <xsl:strip-space elements="*"/> <!--fully qualified path's spaces shall be encoded via encode-for-uri()--> <!--directory and file names are case sensitive--> <xsl:param name="directory" select="'c:/XSLT30/Merging two XML files_XSLT30'"/> <xsl:param name="wildcard" select="'List*.xml'"/> <!--<xsl:mode streamable="yes"/>--> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="/"> <list> <xsl:merge> <xsl:merge-source for-each-item="collection('file:///' || encode-for-uri($directory) || '?strip-space=yes;select=' || $wildcard)" select="list/item"> <xsl:merge-key select="@id" order="ascending"/> </xsl:merge-source> <xsl:merge-action> <xsl:sequence select="current-merge-group()"/> </xsl:merge-action> </xsl:merge> </list> </xsl:template> </xsl:stylesheet> 输出 <?xml version="1.0" encoding="UTF-8"?> <list> <item id="1"> <descr ref="a"/> <descr ref="b"/> </item> <item id="2"> <descr ref="c"/> <descr ref="d"/> </item> <item id="3"> <descr ref="e">one</descr> <descr ref="f">one</descr> </item> <item id="4"> <descr ref="z"/> <descr ref="y"/> </item> </list>

回答 1 投票 0

我如何将未解析的文本函数包装在一个条件中,以便它不会一直被调用?

跟进问题如何将动态文件名传递给 xslt 中的未解析文本函数? 我有以下代码片段: 跟进问题如何将动态文件名传递给 xslt 中的未解析文本函数? 我有以下代码片段: <xsl:variable name="PDFNAME" select="InvoiceIndicators/PdfFileName"/> <xsl:variable name="vText" select="tokenize(unparsed-text('../data/ebpp/fopinvoices/arn/emfe_afp/sample.txt'),'&#xD;&#xA;')"/> <xsl:message>value of unparsed-text is <xsl:value-of select="$vText"/> </xsl:message> <xsl:variable name="PDFFileStatus"> <xsl:for-each select="$vText"> <xsl:if test="contains(.,$PDFNAME)"> <xsl:value-of select="substring-after(.,',')"/> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:message><xsl:text>PDFFileStatus :</xsl:text> <xsl:value-of select="$PDFFileStatus"/> 我在代码的其他部分使用变量 PDFFileStatus 并对其进行检查。 例如在我的代码的某些部分, <xsl:when test="DunningSummary and $PDFFileStatus='Found'"> <xsl:value-of select="generate-id(DunningSummary)"/> </xsl:when> 到目前为止,代码运行得很好。但在某些情况下,我不想输入我编写未解析文本函数的代码。 就像用 if 条件包装它一样: <xsl:if test="InvoiceIndicators/LetterTypeCode = 'PU'"> <xsl:variable name="imagename" select="substring(substring-after(InvoiceDetails/InvoiceNumber, '_'), 3, 9)"/> <xsl:variable name="vText" select="tokenize(unparsed-text(concat('../data/ebpp/fopinvoices/arn/emfe_afp/', $FileName, '.txt')),'&#xD;&#xA;')"/> <xsl:message>value of unparsed-text is <xsl:value-of select="$vText"/> </xsl:message> <xsl:variable name="PDFFileStatus"> <xsl:for-each select="$vText"> <xsl:if test="contains(.,$imagename)"> <xsl:value-of select="substring-after(.,',')"/> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:message><xsl:text>PDFFileStatus :</xsl:text> <xsl:value-of select="$PDFFileStatus"/> </xsl:message> </xsl:if> 但现在我遇到了代码片段的问题,我在其中添加了对变量 PDFFileStatus 的检查。 遇到这种情况我该如何处理? 根据您想要使用该函数的评论 unparsed-text-available https://www.w3.org/TR/xpath-functions-31/#func-unparsed-text-available 然后仅在以下情况下使用 unparsed-text未解析文本可用检查返回 true。

回答 1 投票 0

XslLoadException:禁止解析外部 URI

我有 xslt 工作表,其中包含另一个 xslt 文件的标签,所有文件编译正确并且没有错误,但是当运行以下代码时我遇到异常 var myXslTrans = 新 XslCompiledTransf...

回答 2 投票 0

python saxonche - 为什么executable.transform_to_value 返回 None?

刚刚找到了Python的saxonche库。这太棒了。在玩的过程中我遇到了以下问题: 当尝试使用executable.transform_to_value返回PyXdmNode时,下面的代码...

回答 1 投票 0

连接xpath中的多个节点值

我有一个如下所示的 XML 你好 世界 我有一个如下所示的 XML <element1> <element2> <element3> <element4>Hello</element4> <element5>World</element5> </element3> <element3> <element4>Hello2</element4> <element5>World2</element5> </element3> <element3> <element4>Hello3</element4> <element5>World3</element5> </element3> </element2> </element1> 我正在尝试使用 Xpath 来获得这样的结果: Hello.World Hello2.World2 Hello3.World3 我使用了下面的 concat 函数,但没有得到正确的结果。 连接功能: concat(/element1/element2/element3/element4/text(),".", /element1/element2/element3/element5/text()) 我得到的结果: Hello.World 怎样才能得到正确的结果? 我正在使用 XPath 和 Camel Spring DSL。 编辑: XQuery、XSLT 和 SPel 中的解决方案也受到赞赏。 编辑 我尝试了字符串连接,但没有成功: 字符串连接函数: string-join((/element1/element2/element3/element4/text(), /element1/element2/element3/element5/text()),".") 我得到的结果: Hello.Hello2.Hello3.World.World2.World3 试试这个表达方式... string-join(//element3/(concat(element4/text(), '.', element5/text())), "&#10;") 我使用了 concat 方法,效果很好。 concat(//SomeElement/text(),'_',//OtherElement/text()) 这里有一个解决方案XSLT: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="//element3"> <xsl:value-of select="element4/text()" />.<xsl:value-of select="element5/text()" /> </xsl:template> </xsl:stylesheet> 使用XQuery: for $d in $doc/element2/element3 return fn:string-join(fn:data($d/element()), "."). $doc 存储 Xml。 如果您需要加入 xpath 选择的文本节点但无法使用 string-join(当您坚持使用 XSL 1.0 时),这可能会有所帮助: <xsl:variable name="x"> <xsl:apply-templates select="..." mode="string-join-mode"/> </xsl:variable> joined and normalized: <xsl:value-of select="normalize-space($x)"/> <xsl:template match="*" mode="string-join-mode"> <xsl:apply-templates mode="string-join-mode"/> </xsl:template> <xsl:template match="text()" mode="string-join-mode"> <xsl:value-of select="."/> </xsl:template> <xsl:template match="element3"> <xsl:value-of select="element4,element5" separator="."/> </xsl:template>

回答 6 投票 0

如何在XPath-1.0中进行集合运算?

我在 SO 和其他地方看到以下内容应该有效(这个示例直接来自 O'Reilly 的 XSLT Cookbook): (:交叉点:) $set1[计数(. | $set2) = 计数($set2)] (:

回答 2 投票 0

xsl:元素不想接受来自属性值的字符串

我正在尝试将元素属性值转换为标签(名称)。例如,一个 到一个 。神秘的是,这根本不可能发生,我明白......

回答 1 投票 0

计算至少一个子节点具有该属性的节点

我一直在为此兜圈子。我想统计至少有一项属性发生变化的工人数量。如果名字改变,那就是 1。如果姓氏改变,那...

回答 3 投票 0

Xpath。使用 fn:collection() 和 fn:base-uri() 获取 JSON 文件的 URI

我有一个包含多个 json 文件 (.json) 的文件夹。任务是获取文件夹中每个 json 文件的 uri。我在 xslt 文件中使用 fn:collection 和 fn:base-uri 。但是当我退出时我收到错误...

回答 1 投票 0

子元素未从 XSL 文件填充

当我向父标记添加静态值时,grandChild 标记未填充模板匹配 我尝试过 template-match 和 for-each 遇到问题 输入: <

回答 1 投票 0

在 XSL 的另一部分使用输出转义元素

我不知道如何保存包含 XML 表的输出转义元素并对该 XML 表进行转换。我似乎无法访问转义元素的节点。 这是XM...

回答 1 投票 0

列表项标签 XML:FO 垂直对齐

我正在尝试将项目符号与正文垂直对齐。所以该项目符号应该位于中间(垂直)。但我无法实现它。 我正在尝试将项目符号与正文垂直对齐。所以该项目符号应该位于中间(垂直)。但我无法实现它。 <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block> <xsl:call-template name="gbl-bullet-tick-circle"/> </fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block font-size="10pt"> here is hell lot of text paragraph i want to print... here is hell lot of text paragraph i want to print...here is hell lot of text paragraph i want to print...here is hell lot of text paragraph i want to print... </fo:block> </fo:list-item-body> </fo:list-item> 它正在打印如下所示的内容 . here is hell lot of text paragraph i want to print... here is hell lot of text paragraph i want to print...here is hell lot of text paragraph i want to print...here is hell lot of text paragraph i want to print... 但实际上我希望它打印如下 here is hell lot of text paragraph i want to print... . here is hell lot of text paragraph i want to print...here is hell lot of text paragraph i want to print...here is hell lot of text paragraph i want to print... 有人以前在 XML:FO 中做过这件事吗,请分享一些相关信息。 提前非常感谢您。 问候, 莫娜 快速答案是使用包含两列的表格。对项目符号使用显示对齐。我可以测试列表的一些东西,但我想带有项目符号的块的进展维度可能不受列表主体控制,我不确定。 我测试过,现在我确定了。如果在列表项标签上放置边框,您会发现块边界仅与列表项标签所需的大小相同。 要完成此布局,请使用两列表格,其中第一个单元格具有“display-align=”center”和项目符号,第二个单元格包含内容。

回答 1 投票 0

如何将 xpath 存储在变量中并在另一个 xpath 中使用该变量

将xpath存储在变量中,并在其他xpath语句中调用该变量 示例.xml //ZC_area/块/Next_block/变体 将xpath存储在变量中,并在其他xpath语句中调用该变量 示例.xml <Variable Name="LC_F_DPN"> <Path>//ZC_area/Block/Next_block/Variant</Path> <Variable_type>DPN</Variable_type> <Class_name>Point</Class_name> </Variable> myxslcode.xsl <xsl:variable name="MyPath" select="//Variable/Path"/> <xsl:value-of select="$MyPath[Index_on_line_section =current()/@VARIANT_RANK and Line_section_id =current()/$LC_ID]/../../Id"/> </xsl:if>``` here, MyPath I couldnt able to access. I want to use the MyPath variable and fetch the values, Can someone please help me with this 我喜欢将 Powershell 脚本与 Xml Linq 一起使用 using assembly System.Xml.Linq $filename = 'c:\temp\test.xml' $doc = [System.Xml.Linq.XDocument]::Load($filename) $variables = $doc.Descendants('Variable') $lc_f_dpn = @([System.Linq.Enumerable]::Where($variables, [Func[object,boolean]]{ param($x) $x[0].Attribute('Name').Value -eq 'LC_F_DPN'})) $path = $lc_f_dpn[0].Element('Path').value $path

回答 1 投票 0

XML 未按 XSLT 中的预期形成

我正在使用以下 XSLT 来形成 XML,并且代码工作正常,但我希望将此代码包装在一个条件下。 在下面的 XML 中,因为 S_HL/D_735='T' 只出现一次,这就是我

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.