Xml 选择具有特定两个字符串的节点之间的所有节点
我有一个没有结构标记的XML,需要用特定字符串提取两个节点之间的所有节点。这里是我的XML:Xml 选择具有特定两个字符串的节点之间的所有节点,xml,xslt,xpath,Xml,Xslt,Xpath,我有一个没有结构标记的XML,需要用特定字符串提取两个节点之间的所有节点。这里是我的XML: <singlenode> <title>C-2.6.8</title> <p><b>Test Objective:</b> Verify that reprinting partial labels is possible.</p> <p><b&
<singlenode>
<title>C-2.6.8</title>
<p><b>Test Objective:</b> Verify that reprinting partial labels is possible.</p>
<p><b>Acceptance Criterion:</b> Partial unit labels are reprinted correctly.</p>
<p><b>Prerequisite:</b> You are currently running a <b>track and trace</b> test order with
partial label printing enabled.</p>
<p><b>Test Note:</b></p>
<ul type="disc">
<li>
<p><b>Line:</b> This test assumes an automatic device for aggregating items to
cases.</p>
</li>
</ul>
<p/>
</singlenode>
C-2.6.8
测试目标:验证是否可以重新打印部分标签
验收标准:部分单元标签正确重印
先决条件:您当前正在使用运行跟踪测试订单
已启用部分标签打印
测试说明:
-
行:此测试假设有一个自动设备,用于将项目聚合到
案例
在包含字符串“Test Objective”和“Acceptance Criteria”的节点之间,可以是标记的组合,包含“Acceptance Criteria”和“Premission”的节点之间的标记也是如此。如何提取所有标记,直到节点包含特定字符串
我试图命名所有可能出现的标记,但由于标记的广泛组合,这会产生不想要的结果
我的XSLT(3.0):
![CDATA[
]]
![CDATA[p
/p] ]
给我一个结果:
<testcases>
<testcase internalid=""
name="C-2.6.8">
<node_order/>
<externalid/>
<version/>
<summary><![CDATA[<p>
<b>Test Objective:</b> Verify that reprinting partial labels is possible.</p>
<ul type="disc">
<li>
<p>
<b>Line:</b> This test assumes an automatic device for aggregating items to
cases.</p>
</li>
</ul>
<p>
<b>Acceptance Criterion:</b> Partial unit labels are reprinted correctly.</p>
<ul type="disc">
<li>
<p>
<b>Line:</b> This test assumes an automatic device for aggregating items to
cases.</p>
</li>
</ul>
<p>
<b>Test Note:</b>
</p>
<ul type="disc">
<li>
<p>
<b>Line:</b> This test assumes an automatic device for aggregating items to
cases.</p>
</li>
</ul>]]></summary>
<preconditions><![CDATA[<p><p>
<b>Prerequisite:</b> You are currently running a <b>track and trace</b> test order with
partial label printing enabled.</p>
<ul type="disc">
<li>
<p>
<b>Line:</b> This test assumes an automatic device for aggregating items to
cases.</p>
</li>
</ul></p>]]></preconditions>
</testcase>
</testcases>
测试目标:验证是否可以重新打印部分标签
-
行:此测试假设有一个自动设备,用于将项目聚合到
案例
验收标准:部分单元标签正确重印
-
行:此测试假设有一个自动设备,用于将项目聚合到
案例
测试说明:
-
行:此测试假设有一个自动设备,用于将项目聚合到
案例
]>
先决条件:您当前正在使用运行跟踪测试订单
已启用部分标签打印
-
行:此测试假设有一个自动设备,用于将项目聚合到
案例
]>
预期结果是,“测试记录”只能写入摘要中
如何用字符串“测试目标”、“验收标准”和“先决条件”准确地提取s之间的节点?我想我知道您想要什么了。试试这个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="2.0">
<xsl:variable name="sections" select="'Objective|Acceptance|Instruction|Note|Prerequisite'"/>
<xsl:variable name="total.num.sections" select="count(//p[b[matches(., $sections)]])"/>
<xsl:template match="/">
<testcases>
<testcase>
<xsl:attribute name="internalid"/>
<xsl:attribute name="name">
<xsl:value-of select="title"/>
</xsl:attribute>
<node_order/>
<externalid/>
<version/>
<summary>
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:apply-templates select="//p[b[matches(., 'Objective')]]"/>
<xsl:apply-templates select="//p[b[matches(., 'Acceptance')]]"/>
<xsl:apply-templates select="//p[b[matches(., 'Instruction')]]"/>
<xsl:apply-templates select="//p[b[matches(., 'Note')]]"/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</summary>
<preconditions>
<xsl:apply-templates select="//p[b[matches(., 'Prerequisite')]]"/>
</preconditions>
</testcase>
</testcases>
</xsl:template>
<xsl:template match="p[b[matches(., $sections)]]">
<xsl:if test="contains(., 'Prerequisite')">
<xsl:text disable-output-escaping="yes"><![CDATA[<p></xsl:text>
</xsl:if>
<xsl:copy-of select="."/>
<xsl:variable name="pos" select="count(preceding::p[b])+1"/>
<xsl:variable name="content.between.sections" select="following::p[b[matches(., $sections)]][1]/preceding::*[preceding::p[b[matches(., $sections)]][$pos]]"/>
<xsl:choose>
<xsl:when test="$pos = $total.num.sections">
<!-- Last section -->
<xsl:copy-of select="following-sibling::*"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$content.between.sections"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="contains(., 'Prerequisite')">
<xsl:text disable-output-escaping="yes"></p>]]></xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<testcases>
<testcase internalid="" name="">
<node_order/>
<externalid/>
<version/>
<summary><![CDATA[<p><b>Test Objective:</b> Verify that reprinting partial labels is possible.</p><p><b>Acceptance Criterion:</b> Partial unit labels are reprinted correctly.</p><p><b>Test Note:</b></p><ul type="disc">
<li>
<p><b>Line:</b> This test assumes an automatic device for aggregating items to cases.</p>
</li>
</ul><p/>]]></summary>
<preconditions><![CDATA[<p><p><b>Prerequisite:</b> You are currently running a <b>track and trace</b> test order with partial label printing enabled.</p></p>]]></preconditions>
</testcase>
</testcases>
然后只需定义表模板并在任何地方调用它
希望有帮助 XPath具有运算符
,可以根据文档顺序进行选择(请记住,在XSLT代码中,您需要转义任何Thanx!我在web上发现关于每个组的语法以及如何在XPATH中使用运算符的信息非常少。您对此有什么阅读技巧吗?XSLT和XPATH的语法由W3C指定,因此声称它不是“在web上”很奇怪,它也是在线的。像Saxon或Altova这样生产XSLT处理器的公司也有他们的在线文档,或者,Thanx!这是非常复杂的XSL!:-)我仍在试图找出如何调整它以使其工作。我的挑战如下:1)在前面提到的部分成为表格之后,它在自己的模板中处理。然而,使用XSLT,表也会被收集到数据库中;标签。2) 由于某种原因,我的xsl在上述章节之后处理表格的工作方式与在单个模板中编写的工作方式不同……不幸的是,我没有XSLT方面的经验,需要一些时间来解决这些问题……@Avela-我添加了一条关于如何解释您描述的案例中的章节后数据的说明。当你复习完后,请把我的帖子标记为答案。谢谢。:)
<?xml version="1.0" encoding="UTF-8"?>
<testcases>
<testcase internalid="" name="">
<node_order/>
<externalid/>
<version/>
<summary><![CDATA[<p><b>Test Objective:</b> Verify that reprinting partial labels is possible.</p><p><b>Acceptance Criterion:</b> Partial unit labels are reprinted correctly.</p><p><b>Test Note:</b></p><ul type="disc">
<li>
<p><b>Line:</b> This test assumes an automatic device for aggregating items to cases.</p>
</li>
</ul><p/>]]></summary>
<preconditions><![CDATA[<p><p><b>Prerequisite:</b> You are currently running a <b>track and trace</b> test order with partial label printing enabled.</p></p>]]></preconditions>
</testcase>
</testcases>
<!-- Last section -->
<xsl:copy-of select="following-sibling::*[not(name() = 'table')]"/>