xslt 相关问题

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

选择属性@id对应当前节点的属性@newid的元素()(仅限XPATH)

文字1 文字2 <content> <root> <parametrs @id='par1'><displayText>Text1</displayText></parametrs> <parametrs @id='par2'><displayText>Text2</displayText></parametrs> <parametrs @id='par3'><displayText>Text3</displayText></parametrs> </root> </content> ... <paragraph @newid='par3'>Any text</paragraph> 我用 ancestor::content/root/parametrs[@id = ../@newid]/displayText/ 并且没有效果 但是 ancestor::content/root/parametrs[@id = 'par1']/displayText/ 是工作 ./@newid就是工作 怎么了? 出了什么问题?在谓词(方括号)内,上下文项发生变化,因此“..”从 parametrs 元素中进行选择(因此什么也不选择)。 这是一个连接查询,纯 XPath 1.0 中的连接很棘手(从技术上讲,该语言在关系上并不完整 - 因为它需要范围变量)。 XSLT 中有很多解决方案,但不清楚您是否需要 XSLT 解决方案(您的问题说“ONLY XPATH”,但您已将其标记为 XSLT)。 XPath 2.0+ 中也有简单的解决方案,但您尚未使用 XPath 版本标记问题,所以我不知道 XPath 2.0+ 解决方案对您是否有用。如果您使用的框架(例如 Selenium)尚未采用更新的 XPath 规范,那么您的选择非常有限。

回答 1 投票 0

从 xml 中删除命名空间

下面是我试图将其转换为另一个没有命名空间的 xml 的输入 XML。我尝试删除命名空间,但它不起作用。下面提供了请求所需的所有详细信息。

回答 1 投票 0

有没有办法在运行 xslt 时忽略引用的 dtd?

当我在 Oxygen 中使用 Saxon 运行以下模板时: 当我在 Oxygen 中使用 Saxon 运行以下模板时: <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" expand-text="yes" version="3.0"> <xsl:output indent="yes" method="xml" omit-xml-declaration="no" encoding="utf-8"/> <xsl:template match="/"> <xsl:text>&#xa;</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> <xsl:template match="*"> <!-- On Martin's suggestion I should use node-name instead of name, so I have changed this, but the result is the same. --> <xsl:value-of select="node-name()"/><xsl:text>&#xa;</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> </xsl:stylesheet> 在此 xml 上: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ddn PUBLIC "-//S1000D//DTD Data Dispatch Note 20050501//EN//XML" "http://www.s1000d.org/s1000d_2-2/xml_dtd/ddn/dtd/ddn.dtd"> <ddn> <ddnc> <modelic>ABC</modelic> <sendid>AASSD</sendid> <recvid>VVBBN</recvid> <diyear>2024</diyear> <seqnum>00001</seqnum> </ddnc> </ddn> 我得到以下输出: <?xml version="1.0" encoding="utf-8"?> ddn ddnc modelic sendid recvid diyear seqnum 很明显(至少对我来说),变换知道元素名称。 如果我将与元素匹配的模板更改为: <xsl:template match="ddn"> <xsl:value-of select="node-name()"/><xsl:text>&#xa;</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> 我得到以下内容,其中不包含任何元素名称: <?xml version="1.0" encoding="utf-8"?> ABC AASSD VVBBN 2024 0000 如果我删除文档类型声明并运行相同的转换,我会得到: <?xml version="1.0" encoding="utf-8"?> ddn ABC AASSD VVBBN 2024 00001 现在已经找到root ddn了。 结论是dtd被转换使用了。 我宁愿忽略 dtd,也不愿尝试纠正其中的某些内容,因为 dtd 本来就不是我的。我只需要转换我得到的文件的内容,而这个问题中包含的xml只是实际文件的一小部分,但无论内容是什么,问题都是一样的。 那么我该如何解决这个问题呢?我是否需要在我的规则中添加一些命名空间(尽管 name 函数没有产生类似的东西),或者我可以告诉 Saxon 忽略 dtd 吗?看起来好像这是设置中的默认设置,但我怀疑这里还缺少其他东西。 我已经尝试使用带有内置 xslt 引擎的 XMLSpy 进行相同的转换,并且其行为方式相同。 如果我像这样添加 * 作为命名空间: 如果我将与元素匹配的模板更改为: <xsl:template match="*:ddn"> <xsl:value-of select="node-name()"/><xsl:text>&#xa;</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> 我得到: <?xml version="1.0" encoding="utf-8"?> ddn ABC AASSD VVBBN 2024 00001 所以这可行,但是为什么?!? 建议? 我下载了一些 DTD,它有 <!ELEMENT ddn (rdf:Description?,ddnc,issdate,security,datarest?, dispto,dispfrom,authrtn,mediaid?,remarks?,delivlst?) > <!ATTLIST ddn id ID #IMPLIED xmlns CDATA #FIXED "http://www.s1000d.org/ddn" %RDFDCATT; > 因此,基于此,对于任何非前缀元素,我希望在 XSLT 中声明 xpath-default-namespace="http://www.s1000d.org/ddn" 允许您选择和/或匹配 ddn、ddnc、issdate 等元素。

回答 1 投票 0

使用 XSLT 对 XML 文件进行排序

我有这个 XML 文件(这只是其中的一小部分) 我有这个 XML 文件(这只是其中的一小部分) <?xml version="1.0" encoding="utf-8"?> <InterfaceHeader Version="1" originationsystem="xxx" systemdate="2024-02-22T14:27:11" username="xxx" testindicator="Y"> <Warehouses> <Warehouse> <WarehouseName>WH1</WarehouseName> <Permits> <Permit> <LicenseNumber>R501155DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>000000001</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644839038</VariantSKU> <Quantity>0</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> <Warehouse> <WarehouseName>WH2</WarehouseName> <Permits> <Permit> <LicenseNumber>C470413DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>213456789</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644839038</VariantSKU> <Quantity>93</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> </Warehouses> </InterfaceHeader> <InterfaceHeader Version="1" originationsystem="xxx" systemdate="2024-02-22T14:27:34" username="xxx" testindicator="Y"> <Warehouses> <Warehouse> <WarehouseName>WH2</WarehouseName> <Permits> <Permit> <LicenseNumber>R501155DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>000000001</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644839076</VariantSKU> <Quantity>300</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> <Warehouse> <WarehouseName>WH2</WarehouseName> <Permits> <Permit> <LicenseNumber>C470413DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>213456789</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644839076</VariantSKU> <Quantity>2803</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> </Warehouses> </InterfaceHeader> <InterfaceHeader Version="1" originationsystem"xxx" systemdate="2024-02-22T14:27:44" username="xxx" testindicator="Y"> <Warehouses> <Warehouse> <WarehouseName>WH1</WarehouseName> <Permits> <Permit> <LicenseNumber>R501155DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>000000001</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644727472</VariantSKU> <Quantity>468</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> <Warehouse> <WarehouseName>WH2</WarehouseName> <Permits> <Permit> <LicenseNumber>C470413DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>213456789</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644727472</VariantSKU> <Quantity>4860</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> </Warehouses> </InterfaceHeader> 我怎样才能 删除InterfaceHeader,这样它就只存在一次 对 XML 文件进行排序,因此 WH1 中的所有项目都排在前面,然后是 WH2 中的项目(每个仓库的许可证和所有者 ID 都相同)? 这是我正在寻找的示例: <InterfaceHeader Version="1" originationsystem="xxx" systemdate="2024-02-22T14:27:11" username="xxx" testindicator="Y"> <Warehouses> <Warehouse> <WarehouseName>WH1</WarehouseName> <Permits> <Permit> <LicenseNumber>R501155DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>000000001</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644839038</VariantSKU> <Quantity>0</Quantity> </Item> <Item> <VariantSKU>5707644839076</VariantSKU> <Quantity>300</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> <Warehouse> <WarehouseName>WH2</WarehouseName> <Permits> <Permit> <LicenseNumber>C470413DK</LicenseNumber> <GoodsOwners> <GoodsOwnersIds> <GoodsOwnerId>213456789</GoodsOwnerId> <Items> <Item> <VariantSKU>5707644839038</VariantSKU> <Quantity>93</Quantity> </Item> <Item> <VariantSKU>5707644839076</VariantSKU> <Quantity>2803</Quantity> </Item> </Items> </GoodsOwnersIds> </GoodsOwners> </Permit> </Permits> </Warehouse> </Warehouses> </InterfaceHeader> 我试过这个: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:key name="WarehouseKey" match="InterfaceHeader" use="concat(Warehouses/Warehouse/WarehouseName, '|', @originationsystem)"/> <xsl:template match="/"> <xsl:for-each select="InterfaceHeader[generate-id() = generate-id(key('WarehouseKey', concat(Warehouses/Warehouse/WarehouseName, '|', @originationsystem))[1])]"> <xsl:sort select="Warehouses/Warehouse/WarehouseName"/> <xsl:copy-of select="."/> </xsl:for-each> </xsl:template> </xsl:stylesheet> 但结果是这样的: <?xml version="1.0" encoding="utf-8"?> 您可以使用 Powershell 脚本 using assembly System.Xml.Linq $inputFilename = 'c:\temp\test.xml' $outputFilename = 'c:\temp\test1.xml' $settings = [System.Xml.XmlReaderSettings]::New(); $settings.ConformanceLevel = [System.Xml.ConformanceLevel]::Fragment; $reader = [System.Xml.XmlReader]::Create($inputFilename,$settings); $whareHouses = [System.Collections.ArrayList]::new() $count = 0; $doc = [System.Xml.Linq.XDocument]::new() while ($reader.EOF -eq $False) { if ($reader.Name -ne 'InterfaceHeader') { $reader.ReadToFollowing('InterfaceHeader') | out-null;; } if($reader.EOF -eq $False) { $interfaceHeader = [System.Xml.Linq.XElement][System.Xml.Linq.XElement]::ReadFrom($reader); if($count -eq 0) { $doc.Add($interfaceHeader); } else { $whareHouse = $interfaceHeader.Descendants("Warehouse")[0]; $whareHouses.Add($whareHouse) | out-null } } $count++; } $wharehouse = $doc.Descendants("Warehouses")[0]; $wharehouse.Add($wharehouses); $doc.Save($outputFilename);

回答 1 投票 0

XSL 参数的值在 GA4 select_item 事件中显示为未定义

我正在努力将 Universal Analytics 数据层转换为 GA4 格式,作为此过程的一部分,我需要创建事件来收集以前在页面加载时被动发送的数据

回答 1 投票 0

如何使用 XSLT 获取组中每一行的小计

我有一个特殊要求,要在组的各个行中显示小计。我尝试列出每一行,并使用我按供应商发票编号分组的 for-each-group 函数。但结果...

回答 1 投票 0

如何使用 XSLT 删除字符串中的最后 4 个标记?

我需要删除属性的最后 4 个标记,在本例中是 infoEntityIdent 的最后 4 个标记 这是元素 我需要删除属性的最后 4 个标记,在本例中是 infoEntityIdent 的最后 4 个标记 这是元素<graphic infoEntityIdent="XXX-XXXXXX-X-781410-P-77445-00256-A-000-01"> 结果将是 XXX-XXXXXX-X-781410-P-77445-00256-A 我使用以下 XSLT 让它工作: <xsl:analyze-string select="//figure[@id = current()/@internalRefId]/graphic/@infoEntityIdent" regex="-"> <xsl:matching-substring> <xsl:if test="position() le 14"> <xsl:value-of select="."/> </xsl:if> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:if test="position() le 15"> <xsl:value-of select="."/> </xsl:if> </xsl:non-matching-substring> </xsl:analyze-string> 问题是这不是一个好的编程实践,因为只有当我们有 10 个用“-”分隔的标记时它才有效。 我想删除最后 2 个标记和以 XXX-XXXXXX-X-781410-P-77445-00256-A 结尾的“-” 你可以简单地做: <xsl:value-of select="tokenize($yourString, '-')[position() le last() - 2]" separator="-"/> 补充: 只是为了好玩,这里有一种从(字面意思)另一个方向看它的方法: <xsl:value-of select="reverse(subsequence(reverse(tokenize($yourString,, '-')), 3))" separator="-"/>

回答 1 投票 0

复制 XML 并比较节点 ID,如果不匹配,则不复制节点

测试以下 XSLT 时出现错误消息。 测试以下 XSLT 时出现错误消息。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge" xmlns:n0="http://sap.com/xi/SAPGlobal20/Global"> <!-- Definiere Variablen --> <xsl:variable name="ItemID" select="/multimap:Messages/multimap:Message1/n0:ServiceRequestFollowUpDocumentReplicationRequest/ServiceRequestFollowUpDocumentReplicateRequestMessage/ServiceRequest/Item/ID"/> <xsl:variable name="ServiceRequestItemID" select="/multimap:Messages/multimap:Message4/multimap:ServiceRequestItem"/> <!-- Kopiere das gesamte Dokument --> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <!-- Überspringe ServiceRequestItem, deren ID nicht im ServiceRequest-Element ist --> <xsl:template match="multimap:ServiceRequestItem[not(ID = $ItemID)]"/> </xsl:stylesheet> 这是我的 XML: <multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge"> <multimap:Message1> <n0:ServiceRequestFollowUpDocumentReplicationRequest xmlns:n0="http://sap.com/xi/SAPGlobal20/Global" xmlns:prx="urn:sap.com:proxy:LV9"> <ServiceRequestFollowUpDocumentReplicateRequestMessage> <ServiceRequest actionCode="01" itemListCompleteTransmissionIndicator="true"> <Item actionCode="01"> <ID>10</ID> </Item> <Item actionCode="01"> <ID>80</ID> </Item> </ServiceRequest> </ServiceRequestFollowUpDocumentReplicateRequestMessage> </n0:ServiceRequestFollowUpDocumentReplicationRequest> </multimap:Message1> <multimap:Message4> <ServiceRequestItemCollection> <ServiceRequestItem> <ID>10</ID> </ServiceRequestItem> <ServiceRequestItem> <ID>80</ID> </ServiceRequestItem> <ServiceRequestItem> <ID>30</ID> </ServiceRequestItem> </ServiceRequestItemCollection> </multimap:Message4> </multimap:Messages> 我想要 XML 的副本,但只有当 ID 也包含在 ServiceRequestItem 节点中时,才应复制 Item 中的节点。 您收到错误,因为在 XSLT 1.0 中,匹配模式无法引用变量。 您可以通过以下方式优雅而有效地避免这种情况: XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge" xmlns:n0="http://sap.com/xi/SAPGlobal20/Global"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="keepItems" match="n0:ServiceRequestFollowUpDocumentReplicationRequest/ServiceRequestFollowUpDocumentReplicateRequestMessage/ServiceRequest/Item" use="ID" /> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- Überspringe ServiceRequestItem, deren ID nicht im ServiceRequest-Element ist --> <xsl:template match="ServiceRequestItem[not(key('keepItems', ID))]"/> </xsl:stylesheet>

回答 1 投票 0

使用for-each,我可以获取数组项的值吗?

我对 XSL 相当陌生,所以也许我对 for-each 工作原理的概念是不正确的。我的 for-each 正在从提供的 url 中获取 XML 文档中的每个项目。这正在按预期工作。什么...

回答 1 投票 0

在 XSL 中使用 for-each 时如何访问当前项目的值?

使用下面的代码,如何在不指定$array[1]的情况下访问循环中的当前项? https:...

回答 1 投票 0

XSLT 根据语言上下文删除节点

我在应用样式表时遇到以下问题:这是我给定的 XML 文件: ...

回答 1 投票 0

如何取消选中单选按钮javascript

我有下面的单选按钮。单击该单选按钮后,无法清除该单选按钮。 代码是 我有下面的单选按钮。单击后无法清除单选按钮。 代码是 <td class="Label"> <input class="Label" type="radio" name="reviewoptions_{@id}" value="other" onClick="reAssign({count(../bankguaranteedata)},document.lending.guaranteereviewoptions,this,{@id})"> <xsl:if test="guaranteereviewoptions/reviewoptions[@id='other']='checked'"> <xsl:attribute name="checked"/> </xsl:if> </input>Other</td> 再次单击时是否有可能清除单选按钮? 我实际上用这个: var elements = document.getElementsByTagName("input"); for (var i = 0; i < elements.length; i++) { if (elements[i].type == "radio") { elements[i].checked = false; } } 无法在 HTML 中取消选择单选按钮选项,出于某些原因,您可能想阅读此内容:https://ux.stackexchange.com/questions/13511/why-is-it-impossible-取消选择 html-radio-inputs 试试这个 if($('#checkboxID').is(':checked')){ $('#checkboxID').attr('checked', false); }else{ $('#checkboxID').attr('checked', true); } 此代码使用jquery 您可以尝试使用重置输入。 <input type='reset' /> 调用重置表单单选按钮。 document.getElementById("radiobuttonsform").reset(); 凭借其设计,完全可以取消选择无线电选项。您所需要的只是另一个无线电选项。您可以使用静音收音机选项。它在组中的唯一功能是取消选择其他单选选项。您可以更改不透明度并将其隐藏,然后使用按钮或其他方式激活它。这也使得能够重新选择打开的选项之一。由于选项通常是分组的,因此其他表单元素不会受到影响。

回答 5 投票 0

在 shell 脚本中使用 xmlstarlet 读取脚本变量值,如果该字符串不存在,则插入到特定部分下的输出 xml 文件中

我在 shell 脚本中使用的 parse yaml 实用程序通过 eval 命令生成如下变量 policy1_name='ipfilter' policy1_scope='api' policy1_apiname='apiname' policy1_inboundsession='率-

回答 1 投票 0

使用依赖变量创建特定的 XSL

我正在尝试构建一个 XSL(t) 文件来为我的应用程序指定导入规则集。我的源 XML 来自 SPARQL。 问题是每个查询的变量数量都不同。什...

回答 1 投票 0

xmlstarlet 用于在 xml 字段下插入字符串

我们有一个如下所示的policy.xml文件,需要根据条件在下(入站或后端或出站)下的xml文件的每个会话下插入如下字符串...

回答 1 投票 0

XSLT 删除最后一个重复的空段

我的xml看起来像这样 b 1 ...

回答 1 投票 0

有没有办法将 XSLT 的输出限制为特定数量的记录?

我几乎算不上 XSLT 的新手 - 我本质上是一名网页设计师,正在修改不再在公司工作的开发人员给我的文件。这是我正在使用的代码(减去一堆

回答 1 投票 0

将 xml 注释转换为 html 脚注

我想将 XML 中的注释转换为 HTML 中的脚注。下面的脚本可以很好地完成工作: ...

回答 1 投票 0

即使 XML 标签为空,仍然会打印(xml version =“1.0”encoding ='utf-8')

我对我目前正在处理的 XSL 脚本有疑问。 脚本正在运行,没有遇到错误,但是,我的问题是在一些不支持的字段上......

回答 1 投票 0

变量 XSLT 中的循环变量/参数引用

我有一个简单的 XML: 你好 和表单.xsl: 我有一个简单的 XML: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="form.xsl"?> <x> <y>Hello</y> </x> 和form.xsl: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output encoding="UTF-8" method="xml" indent="yes"/> <xsl:variable name="topLevel"> <xsl:variable name="inner" select="'Hi'" /> <xsl:value-of select="$inner"/> </xsl:variable> <xsl:template match="/" > <xsl:value-of select="$topLevel" /> </xsl:template> </xsl:stylesheet> 我正在使用 JRE 1.8,,当我使用 javax.xml.transform.Transformer 转换 XML 时,我在 topLevel 变量上收到循环引用错误。 Circular variable/parameter reference in '[variable(topLevel)] 我发现已经有一个与此相关的问题记录在:JIRA,但不确定这是否已得到解决。 提供了各种解决方法,但没有提供解决方案。 注意:我没有包含任何第三方 jar,并且正在使用默认的 Transformer 实现。 问题是由于(全局)变量中的变量定义造成的。 如果你移动这条线 在“topLevel”定义之外,您的代码可能会工作。 这种事情在 Xalan 2.7.0 中没问题,但在 2.7.1/2 中会触发错误消息 我写这篇文章是因为我今天遇到了同样的问题,这个答案在谷歌中是第一个,尽管它已经有7年了。 我无法告诉您为什么引入 Xalan 行为的这种变化,只是我观察到了同样的事情,这是我找到的解决方法 就我而言,在删除 xalan(出于安全原因)并使用 jdk 内部实现后,我收到此错误: com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 因此,我将 Saxon-HE 12.4 添加到我的类路径中,它也运行良好,并且支持 ACCESS_EXTERNAL_DTD 等安全属性。

回答 2 投票 0

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