xslt 相关问题

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

XSLT 在 2 个变量之间迭代并生成新变量

我有两个变量,看起来像 [...] [...]...

回答 1 投票 0

如何引用元素名称为number的子节点子集

我正在尝试转换 XML 文档,其中有一个包含子元素 Address[1-9] 的地址节点 目前,我使用以下 xslt 将所有行连接成一个输出 我正在尝试转换 XML 文档,其中有一个包含子元素 Address[1-9] 的地址节点 目前,我使用以下 xslt 将所有行连接成一个输出 <xsl:for-each select="$NodeOfAddress/*[starts-with(name(), 'in:AddressLine')]"> <out:AddressLine> <xsl:value-of select="."/> </out:AddressLine> </xsl:for-each> 这似乎对所有地址线都很有效。 但是,我只想对第 3-6 行执行此操作,而不是全部 9 行。 有没有一种方法可以在每个选择中指定这一点? 我确信我可以用一些 if 语句找出一种方法,但希望也许有一种类似于我上面的方法。 也许: <xsl:for-each select="$NodeOfAddress/*[starts-with(name(), 'in:AddressLine')][3 le position() and position() le 6}"> 在没有看到输入的情况下很难确定。

回答 1 投票 0

XSLT:根据子值显示元素和子元素

我的XML代码显示了员工的所有地址及其使用类型。仅当地址具有特定使用类型时才必须显示。其他人必须被删除。 下面是 xml。 我的 XML 代码显示员工的所有地址及其使用类型。仅当地址具有特定使用类型时才必须显示。其他的必须删除。 下面是xml。 <peci:Person_Communication> <peci:Address> <peci:Usage_Type>HOME1</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Třebíč</peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6</peci:Usage_Behavior_ID> </peci:Usage> </peci:Address> <peci:Address> <peci:Usage_Type>HOME2</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Třebíč</peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16</peci:Usage_Behavior_ID> </peci:Usage> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1</peci:Usage_Behavior_ID> </peci:Usage> </peci:Address> <peci:Address> <peci:Usage_Type>HOME3</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Třebíč</peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-8</peci:Usage_Behavior_ID> </peci:Usage> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-9</peci:Usage_Behavior_ID> </peci:Usage> </peci:Address> <peci:Address> <peci:Usage_Type>HOME4</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Třebíč</peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1</peci:Usage_Behavior_ID> </peci:Usage> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-9</peci:Usage_Behavior_ID> </peci:Usage> </peci:Address> <peci:Address> <peci:Usage_Type>HOME5</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Třebíč</peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> </peci:Address> <peci:Address> <peci:Usage_Type>HOME6</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Třebíč</peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-10</peci:Usage_Behavior_ID> </peci:Usage> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-8</peci:Usage_Behavior_ID> </peci:Usage> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6</peci:Usage_Behavior_ID> </peci:Usage> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1</peci:Usage_Behavior_ID> </peci:Usage> </peci:Address> </peci:Person_Communication> 必须显示仅包含 COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1 、 COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16 和 COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6 的地址以及不包含Usage 元素的地址。其余部分已被删除。 下面是我在 XSLT 代码中编写的逻辑。 <xsl:template match="peci:Person_Communication/peci:Address"> <xsl:variable name="AddUsage1" select="peci:Usage/peci:Usage_Behavior_ID[.='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16' or .='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6' or .='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1']"/> <xsl:variable name="AddUsage2" select="peci:Usage/peci:Usage_Behavior_ID[.='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-9' or .='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-8' or .='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-10' or .='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-11' or .='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-12' or .='COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-13']"/> <xsl:choose> <xsl:when test="$AddUsage1 and not($AddUsage2)"> <xsl:copy-of select="."/> </xsl:when> <xsl:when test="$AddUsage1 and $AddUsage2"> <xsl:copy-of select="peci:Usage_Type|peci:Address_Line_1|peci:Address_Line_3|peci:Address_Line_4|peci:City|peci:Postal_Code|peci:Country|peci:Country_Region"/> <peci:Usage> <xsl:copy-of select="$AddUsage1"/> </peci:Usage> </xsl:when> <xsl:when test="not($AddUsage1) and not($AddUsage2)"> <xsl:copy-of select="."/> </xsl:when> </xsl:choose> </xsl:template>` 下面是输出。 <peci:Person_Communication> <peci:Address> <peci:Usage_Type>HOME1</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Treb�/peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6</peci:Usage_Behavior_ID> </peci:Usage> </peci:Address> <peci:Address> <peci:Usage_Type>HOME2</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Treb�/peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16</peci:Usage_Behavior_ID> </peci:Usage> <peci:Usage> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1</peci:Usage_Behavior_ID> </peci:Usage> </peci:Address> <peci:Usage_Type>HOME4</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Treb�/peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage xmlns:ptdf="urn:com.workday/peci/tdf"> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1</peci:Usage_Behavior_ID> </peci:Usage> <peci:Address> <peci:Usage_Type>HOME5</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Treb�/peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> </peci:Address> <peci:Usage_Type>HOME6</peci:Usage_Type> <peci:Address_Line_1>Gen. Sochora</peci:Address_Line_1> <peci:Address_Line_3>31</peci:Address_Line_3> <peci:Address_Line_4>957</peci:Address_Line_4> <peci:City>Treb�/peci:City> <peci:Postal_Code>674 01</peci:Postal_Code> <peci:Country>CZ</peci:Country> <peci:Usage xmlns:ptdf="urn:com.workday/peci/tdf"> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6</peci:Usage_Behavior_ID> <peci:Usage_Behavior_ID>COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1</peci:Usage_Behavior_ID> </peci:Usage> </peci:Person_Communication> 对于变量 $AddUsage1 和 $AddUsage2 都存在的情况,元素 peci:Address/ 丢失,并且使用行为的所有值都放置在单个 peci:Usage 下,而不是单独的元素下。请帮我修复以下逻辑。 <xsl:when test="$AddUsage1 and $AddUsage2"> <xsl:copy-of select="peci:Usage_Type|peci:Address_Line_1|peci:Address_Line_3|peci:Address_Line_4|peci:City|peci:Postal_Code|peci:Country|peci:Country_Region"/> <peci:Usage> <xsl:copy-of select="$AddUsage1"/> </peci:Usage> </xsl:when> 首先,让我提醒您,获得及时回复的最佳方法是在提问时注意您已提供所有相关信息。 您需要包括: 输入数据(您的数据无效,因为它省略了 peci 命名空间前缀的声明;在我的示例中,我已将 peci 绑定到占位符值 not-supplied) 您现有的完整运行代码(您的不是完整的样式表) 参见 https://stackoverflow.com/help/minimal-reproducible-example 如果我理解正确的话,这是您问题的答案。 我知道您想要删除任何 peci:Address,如果它包含一个 peci:Usage/peci:Usage_Behavior_ID,其值不是这三个可接受值之一: COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1 COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16 COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6 我的示例解决方案使用“身份模板”来复制文档,并定义另一个模板来匹配不可接受的 peci:Address 元素,该模板会覆盖这些元素的身份模板。 peci:Address匹配模板为空,因此匹配的结果是忽略该元素,因此不会将其复制到输出中。 请参阅 XSLT 2.0 规范中有关“身份转换”的部分,其中给出了复制文档并忽略特定 note 元素的示例。 https://www.w3.org/TR/xslt20/#d5e17568 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:peci="not-supplied"> <xsl:output method="xml" indent="true"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- Match, and ignore, any Address which contains a Usage/Usage_Behaviour_ID for which it's not the case that the ID appears in the list of acceptable IDs --> <xsl:template match=" peci:Address[ peci:Usage/peci:Usage_Behavior_ID[ not ( . = ( 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1', 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16', 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6' ) ) ] ] "/> </xsl:stylesheet> 顺便说一句,如果您想知道,布尔表达式 not ( . = ( 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1', 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16', 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6' ) ) 不等于 . != ( 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-1', 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-16', 'COMMUNICATION_USAGE_BEHAVIOR_TENANTED-3-6' ) 在第一个表达式中,如果序列中的 any 项等于上下文项,则 = 运算符返回 true。 在第二个表达式中,如果序列中的 any 项与上下文项不同,则 != 运算符返回 true。 一般来说,not($A = $B)与$A != $B不同。有关详细信息,请参阅 XPath 规范中有关 “常规比较” 的部分。

回答 1 投票 0

XSLT 在表头中收集值

在这个xslt中,我尝试计算我做了多少。因为我需要知道我需要制作多少个。我创建了这个变量集但是...

回答 1 投票 0

当节点B跨越多个页面时,如何确保XSL-FO表(节点A)在下一页的顶部继续?

我正在使用 XSL-FO 生成 PDF,其中由 表示的节点 A 通常在单个页面内完成。同时,节点B常常跨越多个页面。当节点 B 延伸到...

回答 1 投票 0

XSLT for-each 离开主节点

看起来当我执行 xsl:for-each select="//MeetingPollingParts" 时,我脱离了数据并超出了 select="//MeetingPollingQuestion" 的范围。我需要做什么吗...

回答 1 投票 0

如果不同节点中的关键字段是公共的,如何连接不同节点中的 XML 字段?

我的源 xml 文件具有以下形式的元素: ABC 德里 ABC 我的源 xml 文件具有以下形式的元素: <Employees> <Employee> <Name>ABC</Name> <City>Delhi</Delhi> </Employee> <Employee> <Name>ABC</Name> <City>Mumbai</Delhi> </Employee> <Employee> <Name>KBC</Name> <City>Kolkata</Delhi> </Employee> </Employees> 我使用了以下 XSLT 代码 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/root"> <Employees> <xsl:for-each-group select="row" group-starting-with="row[Name/text()]"> <Employee> <FIELD7> <xsl:value-of select="City" separator="|"/> </FIELD7> </Employee> </xsl:for-each-group> </Employees> </xsl:template> </xsl:stylesheet> 在这里,如果员工的姓名相同,那么 XSLT 会将城市与管道连接起来。我的预期输出。 <Employees> <Employee> <Name>ABC</Name> <City>Delhi|Mumbai</Delhi> </Employee> <Employee> <Name>KBC</Name> <City>Kolkata</Delhi> </Employee> </Employees> 您已将问题标记为 XSLT 1.0,但在尝试中您使用了 XSLT 2/3 for-each-group,因此假设您使用的是 XSLT 3 处理器,例如当前版本的 Saxon Java、Saxon JS 或 SaxonC 或 SaxonCS 或 .NET,您会需要这样的代码 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:mode on-no-match="shallow-copy"/> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/Employees"> <xsl:copy> <xsl:for-each-group select="Employee" group-by="Name"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:for-each-group> </xsl:copy> </xsl:template> <xsl:template match="Employee/City"> <xsl:copy> <xsl:value-of select="current-group()/City" separator="|"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 在线小提琴使用 Saxon 12 HE。

回答 1 投票 0

在 XSL 中切换大小写

我有一个具有相同标签的循环来加载十个单元格中的内容,但有不同的div标题和背景图像,所以我想知道是否有任何方法可以使用switch case来放置正确的div标题...

回答 1 投票 0

如何深度复制xml元素内容并将其作为字符串传递给java方法

我有以下 xml 元素: 真实 单击下面的链接即可转到“Java ”页面 我有以下 xml 元素: <notes> <isImportant>true</isImportant> <content><p>Click on the Link below to direct you the page "&#xa0;Java tutorial"</p> <p>&#xa0;<a title="Java tutorial" target="_blank" href="https://www.javatpoint.com/java-tutorial">https://www.javatpoint.com/java-tutorial</a></p></content> </notes> 在 xslt 中,我需要将 isImportant 和 content 元素内容作为字符串传递给 java 方法。 这就是我将它们保存到变量中的方法: <xsl:variable name="notesIsImportant" select="$inputMetaXml//notes/isImportant"/> <xsl:variable name="notesContent"> <xsl:copy-of select="$input//notes/content"/> </xsl:variable> 在模板内我调用java方法: <xsl:value-of select="java:generateNotesJson($customContentInstance,string($notesIsImportant), string($notesContent))"/> 这是我的java课程: public class MetadataHandler { public String generateNotesJson(String isImportant, String content) { return String.format("{\"IsImportant\": \"%s\", \"Content\": \"%s\"}", isImportant, content); } } 问题是,当我传递内容元素的内容时,它只是传递文本节点。如何确保传递所有元素、属性和文本节点,基本上是内容元素内的所有内容? 上述方法调用的实现给出了以下结果: Click on the Link below to direct you the page "&#xa0;Java tutorial" https://www.javatpoint.com/java-tutorial 我想要得到什么: <p>Click on the Link below to direct you the page "&#xa0;Java tutorial"</p> <p>&#xa0;<a title="Java tutorial" target="_blank" href="https://www.javatpoint.com/java-tutorial">https://www.javatpoint.com/java-tutorial</a></p> 对于直接创建 JSON 输出,您可以使用 xsl:output method="json" 或(在本地上下文中)使用选项参数中的 serialize 函数设置 'method':'json' 创建 XPath 3.1/XDM 3.1 映射/数组并直接序列化它们. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all"> <xsl:output method="json" indent="yes"/> <xsl:template match="notes"> <xsl:sequence select="map { 'IsImportant' : string(isImportant), 'Content' : serialize(content!node()) } "/> </xsl:template> </xsl:stylesheet> 输出为 JSON: { "IsImportant": "true", "Content": "<p>Click on the Link below to direct you the page \" Java tutorial\"<\/p>\n <p> <a title=\"Java tutorial\" target=\"_blank\" href=\"https:\/\/www.javatpoint.com\/java-tutorial\">https:\/\/www.javatpoint.com\/java-tutorial<\/a><\/p>" } 在线小提琴.

回答 1 投票 0

对 xslt 中与文本混合的数字进行排序

我需要使用属性“d”按升序对一组文档进行排序。但在这个属性中,数字与字母混合在一起。 属性可以是这样的: d="11A-1-000003" d="11-1-000008...

回答 1 投票 0

统计两个节点之间特定节点的数量

我想计算 XML 中两个节点之间存在的节点。下面是一个演示 XML。 我想计算 XML 中两个节点之间存在的节点。下面是一个演示 XML。 <?xml version="1.0" encoding="UTF-8"?> <body> <a></a> <b></b> <b></b> <b></b> <a></a> <b></b> <a></a> <a></a> <b></b> <b></b> <a></a> </body> 我正在使用下面的 XSLT。 <xsl:template match="a"> <xsl:text>Number of B </xsl:text> <xsl:value-of select="count(preceding::a[1]/following::b)"/> </xsl:template> 我目前的输出。 <body> Number of B 0 <b></b> <b></b> <b></b> Number of B 6 <b></b> Number of B 3 Number of B 2 <b></b> <b></b> Number of B 2 </body> 但是我的预期输出如下。 <body> Number of B 0 <b></b> <b></b> <b></b> Number of B 3 <b></b> Number of B 1 Number of B 0 <b></b> <b></b> Number of B 2 </body> 这里基本上我想在每个a之间进行计数。 这是工作示例 http://xsltransform.net/6r5Gh3F 您可以做的是创建一个键,将 b 元素链接到下面的第一个 a 元素 <xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" /> 然后您可以计算当前 b 元素之前的 a 元素,如下所示: <xsl:value-of select="count(key('b', generate-id()))"/> 尝试这个 XSLT <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" /> <xsl:template match="a"> <xsl:text>Number of B </xsl:text> <xsl:value-of select="count(key('b', generate-id()))"/> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 您可以计算以下b的数量,并减去以下b之后的a的数量: <xsl:template match="a"> <xsl:text>Number of B </xsl:text> <xsl:value-of select="count(following::b) - count(following::a/following::b)"/> </xsl:template>

回答 2 投票 0

html转xml时如何将元素节点分成两部分并分别应用模板?

我有以下标记: 数量:250毫克; 150 我有以下标记: <p> <span> <img id="1286087c-14c9-4678-bfb6-d33fb75300dd"/> </span> <i>Quantity: </i>250 mg; 150<span> <img id="15d9f37c-868f-4cc8-b656-fccdb8017ee9"/> </span>; 170<span> <img id="15d9f37c-868f-4cc8-b656-fccdb8017ee9"/> </span> </p> 我需要的是我需要将其分为两部分: 需要匹配p的所有子元素节点直到i个孩子(也包括i个孩子)。因此,在本例中,span 和 i 并将其映射到 TypeA 元素:<TypeA>Quantity<TypeA> 需要匹配 p 的 i 子节点之后的所有文本和元素节点。然后用分号空格对其进行标记,并将分号空格之前的任何内容放入 TypeB 元素中。在这种情况下,输出应该是 <TypeB>250 mg<TypeB> <TypeB>150<TypeB> <TypeB>170<TypeB> 另外,我需要确保跨度工作的模板规则。 以下是我使用的模板规则: <xsl:mode name="marker" on-no-match="shallow-copy"/> <xsl:mode name="analyze"/> <xsl:template match="p"> <xsl:apply-templates select="i" mode="italic"/> <xsl:variable name="markers" as="element(p)"> <xsl:apply-templates select="." mode="marker"/> </xsl:variable> <xsl:apply-templates select="$marker" mode="wrap"/> </xsl:template> <xsl:template match="p/node()[not(self::i)]" mode="marker"> <xsl:apply-templates select="analyze-string(., ';\s')" mode="analyze-strength"/> </xsl:template> <xsl:template match="*:match" mode="analyze-strength"> <semicolon/> </xsl:template> <xsl:template match="p" mode="wrap"> <xsl:for-each-group select="node()" group-ending-with="semicolon"> <xsl:element name="TypeB"> <xsl:apply-templates select="current-group()"/> </xsl:element> </xsl:for-each-group> </xsl:template> <xsl:template match="semicolon"/> <xsl:template match="p/i" mode="italic"> <xsl:element name="TypeA"> <xsl:apply-templates select="preceding-sibling::span"/> <xsl:value-of select="substring-before(.,':')"/> </xsl:element> </xsl:template> 听起来你并不关心p元素的元素内容,除了想要使用i元素将p元素的内容拆分为两个字符串,组成为: 每个节点的文本值,直到(并包括)i和 i之后的节点的文本值 ...然后使用分隔符; 进一步标记第二个字符串。 如果是这样的话,那么这样的事情对你有用: <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="p"> <xsl:copy> <xsl:variable name="until-i" select="(i/preceding-sibling::node(), i)"/> <xsl:variable name="after-i" select="i/following-sibling::node()"/> <TypeA><xsl:value-of select="normalize-space(string-join($until-i))"/></TypeA> <xsl:for-each select="tokenize(string-join($after-i), ';\s')"> <TypeB><xsl:value-of select="normalize-space(.)"/></TypeB> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet> 结果: <?xml version="1.0" encoding="UTF-8"?> <p> <TypeA>Quantity:</TypeA> <TypeB>250 mg</TypeB> <TypeB>150</TypeB> <TypeB>170</TypeB> </p>

回答 1 投票 0

mod 操作在 XSLT1.0 中的工作方式不同

我需要在XSLT1.0中进行求模运算。但是,它没有返回在 Java 中运行良好的预期结果。 XSLT1.0: 输入: 我需要在XSLT1.0中进行求模运算。但是,它没有返回在 Java 中运行良好的预期结果。 XSLT1.0: 输入: <xsl:variable name="num2" select="'501108006111600075131466'"/> <xsl:variable name="num3" select="'3214282912345698765432161182'"/> <xsl:value-of select="$num2 mod 97"/> <xsl:value-of select="$num3 mod 97"/> 输出: 82 65 Java 输入 StringBuilder numeric = new StringBuilder(); numeric.append(501108006111600075131466);//Input1 //numeric.append(3214282912345698765432161182);//Input2 BigInteger nt = new BigInteger(numeric.toString()); return nt.mod(BigInteger.valueOf(97)).intValue() == 1; 输出 true true 在Java中,返回预期结果,但在XSLT1.0中它不返回准确的输出。在XSLT1.0中还有其他方法实现mod运算符吗? 问题是 XSLT 1.0 代码中的数字表达式将使用 XPath 1.0 numbers,它们只是 双精度浮点数,精度不足以表示示例中的大数字。您的号码的最低有效位将会丢失。 考虑使用数字类型,而不是字符串,但对于很大的数字,您可能需要切换到 XSLT/XPath 2 或 3,其中您有 xs:integer 和 xs:decimal 类型,例如 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all" expand-text="yes"> <xsl:variable name="num1" as="xs:integer" select="501108006111600075131466"/> <xsl:variable name="num2" as="xs:integer" select="3214282912345698765432161182"/> <xsl:output method="xml" indent="yes"/> <xsl:template name="xsl:initial-template"> <tests> <test expression="{$num1} mod 97">{$num1 mod 97}</test> <test expression="{$num2} mod 97">{$num1 mod 97}</test> </tests> </xsl:template> </xsl:stylesheet> 给予 <tests> <test expression="501108006111600075131466 mod 97">1</test> <test expression="3214282912345698765432161182 mod 97">1</test> </tests>

回答 2 投票 0

XSLT 转换期间出错:加载文档“https://ex.com/example.xml”时发生错误。请参阅 InnerException 了解完整描述

我在 XSLT 转换期间不断收到错误:加载文档“https://www.example.com/myxml/example.xml”时发生错误。有关错误的完整描述,请参阅 InnerException...

回答 1 投票 0

XSLT 映射以根据键字段值删除段

我正在尝试编写 XSLT3.0 映射以在其子段 Transmission1 具有键值 //CAN BE REMOVED// 时删除 Transmission 段,我是 XSLT 代码的新手,尝试了一些但无法获得

回答 1 投票 0

使用 XSL 将 Google 标签管理器脚本插入 HTML 时出现问题

我正在使用 xmlstarlet 来生成 HTML,通常效果很好。当我将这些行添加到 XSL 文件时: ...</desc> <question vote="0"> <p>我使用 xmlstarlet 来生成 HTML,通常效果很好。当我将这些行添加到 XSL 文件时:</p> <pre><code>&lt;script async src=&#34;https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXX&#34;&gt;&lt;/script&gt; &lt;script&gt; window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag(&#39;js&#39;, new Date()); gtag(&#39;config&#39;, &#39;G-XXXXXXXXX&#39;); &lt;/script&gt; </code></pre> <p>我收到这些错误:</p> <pre><code>current.xsl:26.87: Opening and ending tag mismatch: head line 8 and script pt async src=&#34;https://www.googletagmanager.com/gtag/js?id=G-QK0NG2KM96&#34;&gt;&lt;/script ^ current.xsl:28.10: Opening and ending tag mismatch: html line 7 and head &lt;/head&gt; ^ current.xsl:120.9: Opening and ending tag mismatch: template line 5 and html &lt;/html&gt; ^ current.xsl:121.16: Opening and ending tag mismatch: stylesheet line 2 and template &lt;/xsl:template&gt; ^ current.xsl:122.1: Extra content at the end of the document &lt;/xsl:stylesheet&gt; </code></pre> <p>我认为问题在于“异步”似乎是不合法的属性。我该如何解决这个问题?</p> </question> <answer tick="false" vote="0"> <p>使用内容的 XHTML 表示形式,我认为是 <pre><code>async=&#34;async&#34;</code></pre>。</p> </answer> </body></html>

回答 0 投票 0

如何在不使用多个<for-each>循环的情况下完成此转换

我在制定这一转型策略时遇到问题。 我不能使用单个 for-each,因为生成的 XML 必须进行排序。 这是输入的xml 我在制定这一转型策略时遇到问题。 我不能使用单个 for-each,因为生成的 XML 必须进行排序。 这里是输入xml <people> <person> <name>Tim</name> </person> <person> <name>Tom</name> </person> <person> <name>Jon</name> </person> <person> <name>Sam</name> </person> <person> <name>Bill</name> </person> </people> 这里是需要输出的方式 <people> <friend> <name>Jon</name> </friend> <friend> <name>Bill</name> </friend> <foe> <name>Sam</name> </foe> <neutral> <name>Tim</name> </neutral> <neutral> <name>Tom</name> </neutral> </people> 将每个名称设置为朋友、敌人、中立的标准位于 xslt 中,但如果我循环遍历每个名称,则元素朋友、敌人和中立将出现乱序并无法通过模式测试。 这是 XSLT 2.0 中的 假设有一个名为“FriendOrFoe”的函数,它将 name 作为参数。你输入一个名字,它会告诉你朋友、敌人、中立 为了表明你的要求是多么荒谬,让我们假设这样的功能确实存在。在这种情况下,此样式表将产生您显示的确切结果: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myfunc="http://www.example.com/myfunc" exclude-result-prefixes="myfunc"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/people"> <xsl:copy> <xsl:for-each-group select="person" group-by="myfunc:FriendOrFoe(name)"> <xsl:sort select="index-of(('friend', 'foe', 'neutral'), current-grouping-key())" /> <xsl:for-each select="current-group()"> <xsl:element name="{current-grouping-key()}"> <xsl:copy-of select="name"/> </xsl:element> </xsl:for-each> </xsl:for-each-group> </xsl:copy> </xsl:template> <xsl:function name="myfunc:FriendOrFoe"> <xsl:param name="name"/> <!-- ??? --> <xsl:choose> <xsl:when test="$name='Jon'">friend</xsl:when> <xsl:when test="$name='Bill'">friend</xsl:when> <xsl:when test="$name='Sam'">foe</xsl:when> <xsl:otherwise>neutral</xsl:otherwise> </xsl:choose> </xsl:function> </xsl:stylesheet>

回答 1 投票 0

为节点添加属性

如果子节点值等于某个字符串,我试图向节点添加属性。 我有一个 main.xml 文件: 32 如果子节点值等于某个字符串,我正在尝试向节点添加属性。 我有一个main.xml文件: <Employees> <Employee> <countryid>32</countryid> <id name="id">1</id> <firstname>ABC</firstname> <lastname>XYZ</lastname> </Employee> <Employee> <countryid>100</countryid> <id name="id">2</id> <firstname>ddd</firstname> <lastname>ggg</lastname> </Employee> </Employees> 因此,假设如果国家/地区 ID 等于 32,则应向 Employee 节点添加属性country=32。输出应如下所示: output.xml: <Employees> <Employee countryid="32"> <countryid>32</countryid> <id name="id">1</id> <firstname>ABC</firstname> <lastname>XYZ</lastname> </Employee> <Employee> <countryid>100</countryid> <id name="id">2</id> <firstname>ddd</firstname> <lastname>ggg</lastname> </Employee> </Employees> 我正在使用以下脚本,但出现错误:无法在包含元素的子级之后创建属性节点。: Transform.xsl: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:include href="Common/identity.xsl"/> <xsl:output indent="yes" method="xml"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="Employees/Employee/countryid[.=32']"> <xsl:attribute name="countryid">32</xsl:attribute> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 任何帮助将不胜感激。我们还可以将 countryid 作为逗号分隔值传递,这样我就可以传递 32,100,然后它应该向所有匹配节点添加属性。 谢谢。 第 1 部分. 假设国家/地区 ID 是 等于 32 那么它应该加上 将“country=32”属性添加到“Employee”节点。 这个转变: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Employee[countryid=32]"> <Employee countryid="{countryid}"> <xsl:apply-templates select="@*|node()"/> </Employee> </xsl:template> </xsl:stylesheet> 应用于提供的 XML 文档时: <Employees> <Employee> <countryid>32</countryid> <id name="id">1</id> <firstname >ABC</firstname> <lastname >XYZ</lastname> </Employee> <Employee> <countryid>100</countryid> <id name="id">2</id> <firstname >ddd</firstname> <lastname >ggg</lastname> </Employee> </Employees> 产生想要的正确结果: <Employees> <Employee countryid="32"> <countryid>32</countryid> <id name="id">1</id> <firstname>ABC</firstname> <lastname>XYZ</lastname> </Employee> <Employee> <countryid>100</countryid> <id name="id">2</id> <firstname>ddd</firstname> <lastname>ggg</lastname> </Employee> </Employees> 解释: 身份规则用于按原样复制每个节点。使用和覆盖身份规则(模板)是最基本、最强大的 XSLT 设计模式。 只有一个模板可以覆盖特定节点的身份规则 -- Employee 元素具有字符串值(转换为数字)的 countryid 子元素 32. 该模板向countryid 元素并应用模板来恢复身份规则的活动并按原样复制其他所有内容。 第 2 部分。 我们还可以将countryid作为逗号传递吗 单独的值,以便我可以通过 32,100 然后应该加上 属性到所有匹配的节点 这个转变: Employee 当应用于同一个 XML 文档(上面)时,会产生所需的正确结果: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:param name="pIds" select="'32,100'"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Employee"> <Employee> <xsl:if test= "contains(concat(',',$pIds,','), concat(',',countryid,',') )"> <xsl:attribute name="countryid"> <xsl:value-of select="countryid"/> </xsl:attribute> </xsl:if> <xsl:apply-templates select="@*|node()"/> </Employee> </xsl:template> </xsl:stylesheet> 除了 Dimitre 的好答案之外,XSLT 2.0 样式表: <Employees> <Employee countryid="32"> <countryid>32</countryid> <id name="id">1</id> <firstname>ABC</firstname> <lastname>XYZ</lastname> </Employee> <Employee countryid="100"> <countryid>100</countryid> <id name="id">2</id> <firstname>ddd</firstname> <lastname>ggg</lastname> </Employee> </Employees> 输出: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="pCountry" select="'32,100'"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Employee[countryid = tokenize($pCountry,',')]"> <Employee countryid="{countryid}"> <xsl:apply-templates select="@*|node()"/> </Employee> </xsl:template> </xsl:stylesheet> 注意:与模式中的序列、参数/变量引用进行存在性比较。 假设 <Employees> <Employee countryid="32"> <countryid>32</countryid> <id name="id">1</id> <firstname>ABC</firstname> <lastname>XYZ</lastname> </Employee> <Employee countryid="100"> <countryid>100</countryid> <id name="id">2</id> <firstname>ddd</firstname> <lastname>ggg</lastname> </Employee> </Employees> 始终是第一个孩子的其他方法: countryid 注意:现在<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:param name="pCountry" select="'32,100'"/> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="countryid[. = tokenize($pCountry,',')]"> <xsl:attribute name="countryid"> <xsl:value-of select="."/> </xsl:attribute> <xsl:call-template name="identity"/> </xsl:template> </xsl:stylesheet> 指令很重要(避免在属性之前输出文本节点)

回答 2 投票 0

如何将适当的 xml 元素与 xmlstarlet 配对?

我有两组 XML 节点,我想查找具有相同“phone”子元素的元素。例如: 111 约翰 我有两组 XML 节点,我想查找具有相同“phone”子元素的元素。例如: <set1> <node> <phone>111</phone> <name>John</name> </node> <node> <phone>444</phone> <name>Amy</name> </node> <node> <phone>777</phone> <name>Robin</name> </node> </set1> <set2> <node> <phone>111</phone> <city>Moscow</city> </node> <node> <phone>444</phone> <city>Prag</city> </node> <node> <phone>999</phone> <city>Rome</city> </node> </set2> 现在我想要得到以下内容: <result> <node> <phone>111</phone> <name>John</name> <city>Moscow</city> </node> <node> <phone>444</phone> <name>Amy</name> <city>Prag</city> </node> <node> <phone>777</phone> <name>Robin</name> </node> <node> <phone>999</phone> <city>Rome</city> </node> </result> 我是 xslt 的初学者,我设法合并两个 xml 并将它们放入 html 表中。但这对比我高一级。 使用钥匙 <xsl:key name="phone" match="node" use="phone"/> 然后使用 Muenchian 分组 进行分组,如下所示: <xsl:template match="/"> <result> <xsl:apply-templates select="//node[generate-id() = generate-id(key('phone', phone)[1])]"/> </result> </xsl:template> <xsl:template match="node"> <xsl:copy> <xsl:copy-of select="phone"/> <xsl:copy-of select="key('phone', phone)/*[not(self::phone)]"/> </xsl:copy> </xsl:template> 为了可读性添加 <xsl:output indent="yes"/> 完整示例 input.xml: <?xml version="1.0"?> <myxml> <set1> <node> <phone>111</phone> <name>John</name> </node> <node> <phone>444</phone> <name>Amy</name> </node> <node> <phone>777</phone> <name>Robin</name> </node> </set1> <set2> <node> <phone>111</phone> <city>Moscow</city> </node> <node> <phone>444</phone> <city>Prag</city> </node> <node> <phone>999</phone> <city>Rome</city> </node> </set2> </myxml> stylesheet.xsl: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:key name="phone" match="node" use="phone"/> <xsl:template match="/"> <result> <xsl:apply-templates select="//node[generate-id() = generate-id(key('phone', phone)[1])]"/> </result> </xsl:template> <xsl:template match="node"> <xsl:copy> <xsl:copy-of select="phone"/> <xsl:copy-of select="key('phone', phone)/*[not(self::phone)]"/> </xsl:copy> </xsl:template> <xsl:output indent="yes"/> </xsl:stylesheet> 命令: xmlstarlet transform stylesheet.xsl input.xml > output.xml output.xml: <?xml version="1.0"?> <result> <node> <phone>111</phone> <name>John</name> <city>Moscow</city> </node> <node> <phone>444</phone> <name>Amy</name> <city>Prag</city> </node> <node> <phone>777</phone> <name>Robin</name> </node> <node> <phone>999</phone> <city>Rome</city> </node> </result>

回答 1 投票 0

xsltproc 给出错误 xmlAddEntity:预定义实体的无效重新声明

一段时间以来,运行 xsltproc (libxml 20913、libxslt 10134 和 libexslt 820)给了我一个以前没有的错误: 错误:xmlAddEntity:预定义实体的重新声明无效 不仅仅是一个

回答 1 投票 0

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