xslt 相关问题

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

使用 xslt 从其他 XML 更新或插入相同节点

我有一个源 xml,其中包含一个元素列表,这些元素可能存在于目标 xml 中,也可能不存在,并且目标 xml 有一些其他 xml 元素。要求是使用规则更新第二个 xml :l...

回答 1 投票 0

XSLT 分页 - 默认为当前日期

我正在使用 xslt 转换来显示一长串事件。 它具有分页功能,但我希望它默认显示最接近当前日期的第一个事件。

回答 2 投票 0

使用saxon作为引擎转换XML时出现的问题

我有一个 xslt 将从这里获得的 RFC 列表转换为内部格式(也是 xml 格式)。 xslt 代码非常明显,它包含与......的前两个级别匹配的模板。

回答 1 投票 0

使用 XSLT 转换防止不应该存在的 <li> 标签出现

我无法让我的 XSLT 脚本不提取原始输入文件中的 标签。请从我的输出中查看下面屏幕截图中的红色圆圈区域: 我的脚本部分... 我无法让我的 XSLT 脚本不提取原始输入文件中的 <li> 标签。请从我的输出中查看下面屏幕截图中的红色圆圈区域: 我遇到问题的脚本部分如下: <xsl:template match="xhtml:ol[@property = 'ktp:questionSet']"> <xsl:param name="path"/> <xsl:variable name="content-item-name" select="//xhtml:section/xhtml:span[@property = 'atom:content-item-name']/@data-value"/> <li class="ktp-question" property="ktp:question" typeof="ktp:Question"> <section class="ktp-question-set-meta"> <xsl:apply-templates select="(//xhtml:section[@class = 'ktp-meta' and not(@property = 'ktp:questionSetType')])[position() = 3 or position() = 4]"/> </section> <section property="ktp:stimulus" typeof="ktp:Stimulus" class="ktp-stimulus"> <xsl:apply-templates select="xhtml:li[@class = 'ktp-stimulus']/node()"/> </section> <section class="ktp-question-stem"> <xsl:apply-templates select="//xhtml:section[@class = 'ktp-question-stem']/node()"/> </section> <ol class="ktp-answer-set"> <xsl:apply-templates select="//xhtml:ol[contains(@class, 'ktp-answer-set')]/node()"/> </ol> <section property="ktp:explanation" typeof="ktp:Explanation" class="ktp-explanation"> <xsl:apply-templates select="//xhtml:section[@class = 'ktp-explanation']/node()"/> </section> </li> </xsl:template> 我正在工作的输入文件如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <link href="../../assets/css/main.css" rel="stylesheet" title="default" type="text/css" /> <title>ptalme03</title> </head> <body> <ol class="ktp-question-set" > <li><ol property="ktp:questionSet" typeof="ktp:QuestionSet" class="ktp-question-set"> <li class="ktp-question-set-meta"><section property="ktp:metadata" class="ktp-meta"> <span property="atom:content-item-name" class="ktp-meta" data-value="ptalme03"></span> </section><section property="ktp:tags" class="ktp-meta"> <span property="ktp:questionSetType" class="ktp-meta" >shared-stimulus</span> </section></li> <li property="ktp:stimulus" typeof="ktp:Stimulus" class="ktp-stimulus"><p> <img src="../../img/alpha_images_pt1/SAT_PT_math2_Q3.svg" /> </p></li> <li property="ktp:question" typeof="ktp:Question" class="ktp-question"> <span property="atom:content-item-name" class="ktp-meta" data-value="ptalme03"></span> <section class="ktp-question-meta"> <section class="ktp-meta" property="ktp:metadata"> <span class="ktp-meta" data-value="ptalme03" property="atom:content-item-name"></span> </section> <section class="ktp-meta" property="ktp:tags"> <span class="ktp-meta" property="ktp:interactionType" >single-select</span> <span class="ktp-meta" property="OLD QID">ftm02.03</span> </section> </section><section class="ktp-question-stem"> <p>What is the <i>x</i>-intercept of the graph shown? </p> </section><ol class="ktp-answer-set"> <li property="ktp:answer" typeof="ktp:AnswerCorrect">(−1, 0)</li> </ol><section property="ktp:explanation" typeof="ktp:Explanation" class="ktp-explanation"> <section class="ktp-explanation-section" data-title="Feedback" data-uuid="e955d9441cc051f966008c9d6da75adc" property="ktp:explanation-section" typeof="ktp:feedback"> <p><b>Getting to the Answer:</b> The <i>x</i>-intercept is the point where the graph crosses the <i>x</i>-axis. The graph crosses the <i>x</i>-axis at (−1, 0). <b>(A)</b> is correct. </p> </section> </section> </li> </ol> </li> </ol> </body> </html> 查看问题中包含的 XSLT 模板,它在输出中生成的唯一 li 元素是: <li class="ktp-question" property="ktp:question" typeof="ktp:Question"> ... </li> 在您发布的输出图像中,上述元素是另一个没有属性的 <li> 元素的 子元素。因此,您在图像中圈出的不需要的 <li> 元素不可能由您在问题中包含的模板生成。它是由您未包含的其他模板生成的。 几乎可以肯定,输出中的 <li> 是 <li> 的副本,它作为 <ol class="ktp-question-set" > 元素的子元素出现在输入文件中,并且也是被样式表忽略的元素的父元素: <ol property="ktp:questionSet" typeof="ktp:QuestionSet" class="ktp-question-set">。我猜测省略是由与 ol 匹配的模板引起的,并且在将模板应用于其子元素之前无法复制该元素,因此最终会得到一个 li 作为另一个 li 的子元素。如果您确实想删除 ol,则还必须删除其父级 li。

回答 1 投票 0

XSLT 2.0 - 无法根据条件获取节点的位置号

这是我的源 XML 的简化版本 1234 这是我的源 XML 的简化版本 <?xml version="1.0" encoding="UTF-8"?> <Workers> <Worker> <ID>1234</ID> <Locaitons> <Location> <Primary>N</Primary> <Name>Oslo</Name> </Location> <Location> <Primary>N</Primary> <Name>Munich</Name> </Location> <Location> <Primary>Y</Primary> <Name>London</Name> </Location> <Location> <Primary>Y</Primary> <Name>New York</Name> </Location> </Locaitons> </Worker> <Worker> <ID>6789</ID> <Locaitons> <Location> <Primary>Y</Primary> <Name>Zurich</Name> </Location> <Location> <Primary>N</Primary> <Name>Brisbane</Name> </Location> <Location> <Primary>Y</Primary> <Name>Paris</Name> </Location> <Location> <Primary>Y</Primary> <Name>Toronto</Name> </Location> </Locaitons> </Worker> </Workers> 预期输出是 1234,Oslo,Default,Oslo 1234,Munich,Default,Munich 1234,London,01,,London <!-- 3rd field's position id is 01 --> 1234,New York,02,,New York <!-- 3rd field's position id is 02 --> 6789,Zurich,01,,Zurich <!-- 3rd field's position id is 01 --> 6789,Brisbane,Default,Brisbane 6789,Paris,02,,Paris <!-- 3rd field's position id is 02 --> 6789,Toronto,03,,Toronto <!-- 3rd field's position id is 03 --> 我的尝试是 <?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="2.0"> <xsl:variable name="linefeed" select="'&#13;&#10;'"/> <xsl:output method="text" encoding="UTF-8"/> <xsl:variable name="delimiter" select="','"/> <xsl:template match="Workers"> <xsl:for-each select="Worker/Locaitons/Location"> <xsl:call-template name="rec"/> </xsl:for-each> </xsl:template> <xsl:template name="rec"> <xsl:value-of select="../../ID"/> <xsl:value-of select="$delimiter"/> <xsl:value-of select="Name"/> <xsl:value-of select="$delimiter"/> <xsl:choose> <xsl:when test="Primary='Y'"> <xsl:value-of select="format-number(position(),'00')"/> <xsl:value-of select="$delimiter"/> </xsl:when> <xsl:when test="Primary='N'"> <xsl:text>Default</xsl:text> </xsl:when> <xsl:otherwise></xsl:otherwise> </xsl:choose> <xsl:value-of select="$delimiter"/> <xsl:value-of select="Name"/> <xsl:value-of select="'&#10;'"/> </xsl:template> </xsl:stylesheet> 当前输出为 1234,Oslo,Default,Oslo 1234,Munich,Default,Munich 1234,London,03,,London <!-- correct value for 3rd field should be 01 --> 1234,New York,04,,New York <!-- correct value for 3rd field should be 02 --> 6789,Zurich,05,,Zurich <!-- correct value for 3rd field should be 01 --> 6789,Brisbane,Default,Brisbane 6789,Paris,07,,Paris <!-- correct value for 3rd field should be 02 --> 6789,Toronto,08,,Toronto <!-- correct value for 3rd field should be 03 --> 节点 1,2,3 等的位置 id 应根据元素 <Primary> = Y 的值填充。我无法在 Primary = Y 中添加条件 <xsl:for-each select="Worker/Locaitons/Location[Primary='Y']">,因为我正在 rec 模板内执行其他几个验证。 任何帮助以获得所需的输出表示赞赏? 谢谢! 当您调用 position() 函数时,您将在之前的 <xsl:for-each select="Worker/Locaitons/Location"> 建立的“动态上下文”中找到上下文节点的位置。因此,该数字反映了 Location 在作为 Location 元素后代的所有 Workers 元素的序列中的位置。 在我看来,您想要 Location 在其父 Locaitons 元素中的位置(顺便说一句,该元素的名称拼写错误)。这将由表达式 1 + count(preceding-sibling::Location) 给出。例如 <xsl:value-of select="format-number(1 + count(preceding-sibling::Location),'00')"/>

回答 1 投票 0

编译为xslt?

这个问题的答案很可能是否定的,因为大量的搜索却一无所获。我以为我很久以前就看到过类似的东西,但这一切可能都是海市蜃楼。 基本上,这太可怕了

回答 5 投票 0

如何使用 XSLT 3.0 将 XML 转换为 JSON

下面是我的输入 XML,需要使用 XSLT 3.0 将其转换为下面的输出 JSON。 使用下面的 XSLT 代码,它仅给出值,但不给出 JSON 字段名称。你能帮我吗...

回答 1 投票 0

如何对 xslt 中的位置重新编号

我想询问如何通过 XSLT 对 PARENTID 中的 LINENUM 和引用重新编号。 LINENUM 的顺序应该正确。目前有1,4,5,因为使用了position() wh...

回答 1 投票 0

使用 HTML/XML/XSLT/AJAX 的可滚动电视指南

我正在尝试创建一个电视指南,类似于大多数已经存在的电视指南(http://www.freeview.co.uk/whats-on/tv-guide) - 当您单击下一步时,它会显示下一个x 小时数。问题是,我...

回答 1 投票 0

XSLT:如何检查重复条目并仅返回具有活动状态的条目(对于具有重复的条目)?

我正在尝试输出一个文本文件,该文件将删除重复项,并仅返回该 id 重复项的活动文件。 **例如,如果我在 xml 中有 2 个条目,但条目具有相同的 ID,则仅...

回答 1 投票 0

XSLT:如何检查重复条目并仅返回具有重复的 id 的活动状态的 id

我正在尝试输出一个文本文件,该文件将删除重复项,并仅返回该 id 重复项的活动文件。 **例如,如果我在 xml 中有 2 个条目,但条目具有相同的 ID,则仅...

回答 1 投票 0

XSLT:如何检查重复并仅返回具有重复的 id 的活动状态的 id

我正在尝试输出一个文本文件,该文件将删除重复项并仅返回活动状态。 例如: 1 不活跃 我正在尝试输出一个文本文件,该文件将删除重复项并仅返回活动状态。 例如: <Report_Data> <Report_Entry> <id>1</wd:id> <status>Inactive</status> <Report_Entry> <Report_Entry> <id>1</wd:id> <status>Active</status> <Report_Entry> <Report_Entry> <id>3</wd:id> <status>Active</status> <Report_Entry> <Report_Entry> <id>4</wd:id> <status>Inactive</status> <Report_Entry> 我尝试使用 xsl:for-each-group 和 group-by 但没有达到结果。 <xsl:template match="Report_Data"> <row> <text>id|status</text> <xsl:value-of select="$newline"/> </row> <xsl:for-each-group select="Report_Entry" group-by="id[../status='Active']"> <row> <id> <xsl:value-of select="id"/> <xsl:value-of select="$delimiter"/> </id> <status> <xsl:value-of select="status"/> </status> </row> 输出为: id|status 1|Active 3|Active 但是期望的输出是 id|status 1|Active 3|Active 4|Inactive 尝试了此代码,但也返回了错误的输出 <xsl:for-each-group select="Report_Entry[status='Active']" group-by="id"> 提前致谢。 :) 你的问题不太清楚。也许这样的东西适合你: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/Report_Data"> <xsl:text>id|status&#10;</xsl:text> <xsl:for-each-group select="Report_Entry" group-by="id"> <xsl:value-of select="id"/> <xsl:text>|</xsl:text> <xsl:value-of select="if(current-group()/status='Active') then 'Active' else 'Inactive'"/> <xsl:text>&#10;</xsl:text> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

XSLT:如何检查重复并仅返回具有活动状态的ID

我正在尝试输出一个文本文件,该文件将删除重复项并仅返回活动状态。 例如: 1 不活跃 我正在尝试输出一个文本文件,该文件将删除重复项并仅返回活动状态。 例如: <Report_Data> <Report_Entry> <id>1</wd:id> <status>Inactive</status> <Report_Entry> <Report_Entry> <id>1</wd:id> <status>Active</status> <Report_Entry> <Report_Entry> <id>3</wd:id> <status>Active</status> <Report_Entry> <Report_Entry> <id>4</wd:id> <status>Inactive</status> <Report_Entry> 我尝试使用 xsl:for-each-group 和 group-by 但没有达到结果。 <xsl:template match="Report_Data"> <row> <text>id|status</text> <xsl:value-of select="$newline"/> </row> <xsl:for-each-group select="Report_Entry" group-by="id[../status='Active']"> <row> <id> <xsl:value-of select="id"/> <xsl:value-of select="$delimiter"/> </id> <status> <xsl:value-of select="status"/> </status> </row> 输出为: id|status 1|Active 3|Active 但是期望的输出是 id|status 1|Active 3|Active 4|Inactive 尝试了此代码,但也返回了错误的输出 <xsl:for-each-group select="Report_Entry[status='Active']" group-by="id"> 提前致谢。 :) 你的问题不太清楚。也许这对你有用: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/Report_Data"> <xsl:text>id|status&#10;</xsl:text> <xsl:for-each-group select="Report_Entry" group-by="id"> <xsl:value-of select="id"/> <xsl:text>|</xsl:text> <xsl:value-of select="if(current-group()/status='Active') then 'Active' else 'Inactive'"/> <xsl:text>&#10;</xsl:text> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

如何在 XSLT3.0 中为以下代码启用流式传输,因为输入有效负载可能超过 80MB,并且我们正在观察性能问题

问题 当前的问题是,使用下面的 XSLT 代码,当输入有效负载很大(例如 80MB)时,输入有效负载将被加载到内存中,因此会消耗备忘录...

回答 1 投票 0

将 Google 字体添加到 XSLT 中的 <head>

我正在使用 Google Search Appliance 来过滤搜索结果,并且该页面是用 XSLT 编写的。我想链接到 中的 Google 字体,但无法管理。 HTML: 我正在使用 Google Search Appliance 来过滤搜索结果,并且该页面是用 XSLT 编写的。我想在 <head> 中链接到 Google 字体,但无法管理。 HTML: <head> <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,600' rel='stylesheet' type='text/css'> </head> 我尝试过的XSL: <xsl:template name="addOpenSansStart"> <xsl:text disable-output-escaping="yes">&lt;head&gt;</xsl:text> <xsl:element name="link"> <xsl:attribute name="href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,600'">href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,600'</xsl:attribute> <xsl:attribute name="rel='stylesheet'">rel='stylesheet'</xsl:attribute> <xsl:attribute name="type='text/css'">type='text/css'</xsl:attribute> </xsl:element> </xsl:template> <xsl:template name="addOpenSansEnd"> <xsl:text disable-output-escaping="yes">&lt;/head&gt;</xsl:text> <xsl:text> </xsl:text> </xsl:template> 还有: <xsl:template name="addOpenSansStart"> <xsl:text disable-output-escaping="yes">&lt;head&gt;</xsl:text> <xsl:text disable-output-escaping="yes">&lt;link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,600' rel='stylesheet' type='text/css' /&gt;</xsl:text> </xsl:template> <xsl:template name="addOpenSansEnd"> <xsl:text disable-output-escaping="yes">&lt;/head&gt;</xsl:text> <xsl:text> </xsl:text> </xsl:template> 两者都给了我错误元素类型“link”必须由匹配的结束标记“</link>”终止。 您会很高兴得知您可以简单地包含要生成的文字标记: <xsl:template name="addOpenSansStart"> <head> <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,600' rel='stylesheet' type='text/css'/> </head> <!-- the rest of your template --> </xsl:template> 如果您确实需要使用 xsl:element 和 xsl:attribute,请意识到 name 属性不应包含该属性的值: <xsl:template name="addOpenSansStart"> <head> <xsl:element name="link"> <xsl:attribute name="href">https://fonts.googleapis.com/css?family=Open+Sans:400,300,600</xsl:attribute> <xsl:attribute name="rel">stylesheet</xsl:attribute> <xsl:attribute name="type">text/css</xsl:attribute> </xsl:element> </head> <!-- the rest of your template --> </xsl:template> 无论哪种方式都适合您。 请注意,如果您需要添加添加 Google 字体时经常使用的预连接链接,或者您想要导入多种字体,则需要通过以下方式编辑这些字体以确保它们是有效的 XHTML/XML: 将所有与号“&”替换为“&” 在“crossorigin”后面添加一个等号,后跟两个双引号 在所有自关闭链接元素的末尾添加尾部斜杠 例如以下 HTML: <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400&family=Raleway:wght@400&display=swap" rel="stylesheet"> 需要转换为: <link rel="preconnect" href="https://fonts.googleapis.com"/> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""/> <link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400&amp;family=Raleway:wght@400&amp;display=swap" rel="stylesheet"/>

回答 1 投票 0

XSLT:使用关键字段时的排序问题

我在对 LuLineItem 进行排序时遇到问题,我需要在其相应的 Iden/IdenValue 时对其进行排序,其中 IdenType=OCC1 在另一个 LuLineItem 中重复,然后基于 Idenvalue,其中 Identype=

回答 1 投票 0

使用关键字段时的排序问题

我在对 LuLineItem 进行排序时遇到问题,我需要在其相应的 Iden/IdenValue 时对其进行排序,其中 IdenType=OCC1 在另一个 LuLineItem 中重复,然后基于 Idenvalue,其中 Identype=

回答 1 投票 0

XPath 中的逻辑或?为什么不是| (管道符号)工作吗?

我有一个 XSLT 模板,它对所有级别的主题进行计数,用于在我拥有的 DITA 项目中用编号来标记这些主题。 我有一个 XSLT 模板,它对所有级别的主题进行计数,用于在我拥有的 DITA 项目中用编号来标记这些主题。 <xsl:template match="*[contains(@class, ' bookmap/chapter ')] | *[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')])]" mode="topicTitleNumber"> <xsl:number format="1 " count="*[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')])] | *[contains(@class, ' bookmap/chapter ')]" level="multiple"/> </xsl:template> 我正在尝试为计算的内容添加额外的排除项,因为当 topicref 类具有 title 元素且 outputclass 为 noNum 时。 <xsl:template match="*[contains(@class, ' bookmap/chapter ')] | *[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')])]" mode="topicTitleNumber"> <xsl:number format="1 " count="*[contains(@class, ' map/topicref ')] [not(ancestor-or-self::*[contains(@class,' bookmap/frontmatter ')] | *[contains(title/@outputclass, 'noNum')])] | *[contains(@class, ' bookmap/chapter ')]" level="multiple"/> </xsl:template> 如上所示,我在第一个 | *[contains(title/@outputclass, 'noNum')] 语句之后添加了 not,认为这将充当附加条件,在调用模板时,count 调用将跳过(即 ...不是祖先 -或-self 与[criteria] 或标题outputclass 属性为“noNum”的主题...)。然而,我添加的标准似乎被视为模板“确实”匹配并计数的内容。 假设我在最后一点上是正确的,我相信我需要将该条件放在它自己的“not”语句中,但我不确定如何使用 XPath 中已存在的条件来做到这一点。 在 XPath 中 | 是集合并运算符,而不是逻辑 OR。 联合运算符,| XPath 1.0 |运算符计算其操作数的并集,操作数必须是节点集。 XPath 2.0+ union 和 | 运算符是等效的。它们采用两个节点序列作为操作数,并返回一个包含任一操作数中出现的所有节点的序列。 逻辑或,or 使用 or 代替 逻辑 OR . 复杂的 XPath 仍然无法工作? 将其分解为更小的部分: //*[contains(@class, ' bookmap/chapter ')]是否选择了您期望的内容? 对逻辑表达式的每个最基本部分重复单独。 将这些单独验证的术语或谓词一次一个地组合起来,并观察沿途的每一步,都不会出现意外。 在合并附加条款之前修复预期结果与实际结果之间的任何差异。

回答 1 投票 0

如何在 XPath 3.1 和 XSLT 中构建具有错误处理功能的健壮 XML 解析器

我的用例:我想分析一个大型 XML 文档,其中包含名为ownedComment 的元素。每个元素都有一个称为 body 的属性。该属性的内容应该是一个字符串,

回答 1 投票 0

仅在子节点存在时变换标签

我有一个 XML 文件: 原创 ...

回答 1 投票 0

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