xslt 相关问题

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

使用 PowerShell 将 XSL 应用到 XML:调用“Transform”时出现异常

我正在尝试使用 XSL 转换来清理 XML 文件。当我将 XSL 直接应用到 XML 文件时,它工作得很好。但现在我想清理目录中的每个 XML 文件。我已经尝试过

回答 3 投票 0

XSLT 根据关键字段值拆分为单独的段

我正在尝试编写XSLT映射来基于子段Instructiontext创建单独的指令段,只要InstructionText段中存在名为/NEW LINE/的关键字...

回答 1 投票 0

将 XML 转换为另一种格式并添加行号

我想转换 XML 并添加行号 XML 文件示例如下: abc ...

回答 2 投票 0

XSLT:使用键和条件的“选择值”?

这个问题是上一个线程的延续:XSLT:根据其他节点的值之和进行排序 我现在可以使用键从其他节点汇总数据。 我似乎无法得到的是

回答 2 投票 0

VS Express 或 VS:WebDev Express 是否包含 XSLT 调试

谁能告诉我 VS Express(C#、VB 等)版本是否包含 XSLT 调试器或 VS Web Developer?

回答 1 投票 0

XSL FO 在表格单元格中添加内容与前面的点右对齐(如果内容之前存在空格)

需要将内容与单元格的右侧对齐。 如果单元格中存在空间,则需要用点填充 您好,欢迎来到 Stackoverflow ......欢迎来到 Stackoverflow ...... 斯塔克洛弗...

回答 1 投票 0

删除xslt中的子节点

[XSLT 1.0] 我有一个像这样的 xml 文档: 此处为标题文字,此处为 italic ,此处为 bold&l... [XSLT 1.0] 我有一个像这样的 xml 文档: <doc> <article> <photo> <caption> <p> caption text here with <i>italic</i> here and <b>bold</b> here<credit>photo copyright</credit> </p> </caption> </photo> </article> </doc> 因此 <credit> 标签嵌套在 <p> 标签中。 我有模板来复制 <i> 和 <b> 标签,如下所示: <xsl:template match="i"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="b"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> 我需要在输出中获得的是:带有 <i> 和 <b> 标签的标题文本,然后是照片版权。我还需要在两者之间有一个换行符(我的意思是在标题文本和照片版权之间);我不想重复照片版权(我不想在输出的两行中重复两次)。所以请求的输出是: 此处为标题文字,此处为<i>斜体</i>,此处为<b>粗体</b>照片版权 我能做到: <xsl:apply-templates select="caption/p/text()"/> <xsl:value-of select="caption/p/credit"/> …但在这里我失去了我的 <i> 和 <b> 标签,我在输出中确实需要这些标签…而且我没有换行符。 我也可以这样做: <xsl:apply-templates select="caption/p"/> <xsl:value-of select="caption/p/credit"/> …但是这里我有两次照片版权。而且我也没有换行… 所以我正在寻找一些技巧:1/保留我的<i>和<b>标签 - 2/在标题文本和照片版权之间添加换行符 - 3/删除标题文本中的<credit>节点输出。 我确实找到了方法。现在我的 xsl 中只有 : <xsl:apply-templates select="caption/p"/> <xsl:value-of select="caption/p/credit"/> 就像上面一样......但我添加了一个这样的模板: <xsl:template match="credit"> <xsl:text>&#xa;</xsl:text> </xsl:template> 并且......我必须说,这在某种程度上是有效的,因为我确实保留了 <i> 和 <b> 标签,我确实在标题文本和照片版权之间得到了换行符,并且我确实摆脱了 我的标题文本输出中的 <credit> 节点。问题是:我觉得这很尴尬...... 那么请问您如何以更好的方式做到这一点?我是 xsl 新手,我不知道...... 试试这个: <?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" exclude-result-prefixes="xs" version="1.0"> <xsl:template match="@*|node()" > <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <xsl:template match="credit"> <xsl:text>&#xa;</xsl:text> <!-- If you want to get rit of the line-break inside credit, i.e. do a normalize-space like this <xsl:value-of select="normalize-space(text())"/> --> <xsl:apply-templates select="node()" /> <xsl:text>&#xa;</xsl:text> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

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