xslt-1.0 相关问题

将此标记用于特定于XSL转换版本1.0的问题,而不是其他版本。

XSLT - 将父节点复制到子节点中

我需要将父节点的副本移动到多个子节点中,而无需在此过程中复制所述子节点本身。这是一个示例 XML: 是 我需要将父节点的副本移动到多个子节点中,而无需在此过程中复制所述子节点本身。这是一个示例 XML: <FoodGroups> <Nutritional>Yes</Nutritional> <Artifical>No</Artificial> <FoodGroup> <Fruit>Grape</Fruit> <Fruit>Apple</Fruit> </FoodGroup> <FoodGroup> <Vegetable>Carrot</Vegetable> <Vegetable>Potato</Vegetable> <FoodGroup> </FoodGroups> 转换完成后,我需要 XML 如下所示: <xml> <FoodGroup> <Fruit>Grape</Fruit> <Fruit>Apple</Fruit> <FoodGroups> <Nutritional>Yes</Nutritional> <Articial>No</Artificial> </FoodGroups> </FoodGroup> <FoodGroup> <Vegetable>Carrot</Vegetable> <Vegetable>Potato</Vegetable> <FoodGroups> <Nutritional>Yes</Nutritional> <Articial>No</Artificial> </FoodGroups> <FoodGroup> </xml> 我试过使用以下 XML: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output omit-xml-declaration="yes" method="xml" indent="yes"/> <xsl:template match="/"> <xml> <xsl:copy> <xsl:apply-templates select="//FoodGroup"/> </xsl:copy> </xml> </xsl:template> <xsl:template match="//FoodGroup"> <FoodGroup> <xsl:copy-of select="./*"/> <xsl:copy-of select="//FoodGroups/*[not(child::FoodGroup)]"/> </FoodGroup> </xsl:template> </xsl:stylesheet> 但是,我得到以下输出(子节点完全重新复制——我不想要这个): <xml> <FoodGroup> <Fruit>Grape</Fruit> <Fruit>Apple</Fruit> <FoodGroups> <Nutritional>Yes</Nutritional> <Artifical>No</Artificial> <FoodGroup> <Fruit>Grape</Fruit> <Fruit>Apple</Fruit> </FoodGroup> <FoodGroup> <Vegetable>Carrot</Vegetable> <Vegetable>Potato</Vegetable> <FoodGroup> </FoodGroups> </FoodGroup> <FoodGroup> <Vegetable>Carrot</Vegetable> <Vegetable>Potato</Vegetable> <FoodGroups> <Nutritional>Yes</Nutritional> <Artifical>No</Artificial> <FoodGroup> <Fruit>Grape</Fruit> <Fruit>Apple</Fruit> </FoodGroup> <FoodGroup> <Vegetable>Carrot</Vegetable> <Vegetable>Potato</Vegetable> <FoodGroup> </FoodGroups> <FoodGroup> </xml> 这种亲子复制能做吗?是否可以?部分困难在于,有时这些孩子的深度不止一层。 以下似乎可以完成这项工作: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="/"> <xml> <xsl:apply-templates/> </xml> </xsl:template> <xsl:template match="FoodGroups"> <xsl:apply-templates/> </xsl:template> <xsl:template match="FoodGroups/*[not(self::FoodGroup)]"/> <xsl:template match="FoodGroup"> <xsl:copy> <xsl:apply-templates/> <FoodGroups> <xsl:copy-of select="ancestor::FoodGroups/*[not(self::FoodGroup)]"/> </FoodGroups> </xsl:copy> </xsl:template> </xsl:stylesheet> 为什么不简单(而且更有效): XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/FoodGroups"> <xml> <xsl:variable name="common" select="*[not(self::FoodGroup)]" /> <xsl:for-each select="FoodGroup"> <xsl:copy> <xsl:copy-of select="*"/> <FoodGroups> <xsl:copy-of select="$common"/> </FoodGroups> </xsl:copy> </xsl:for-each> </xml> </xsl:template> </xsl:stylesheet>

回答 2 投票 0

如何在 HTML 中将一系列具有相同类的兄弟元素分组?

我想使用 XSLT 1.0 处理以下输入 HTML,以便对一系列同级元素进行分组。 &...

回答 1 投票 0

phpword 使用 xsl 更新段落文本

我正在使用 phpword 模板处理器替换 word 模板中的变量并另存为新文档。然后,我加载输出文档并使用 xsl 更改段落中的文本。为了找回sp...

回答 0 投票 0

在同一个地方复制所有重复的标签

我正在使用 xslt 1.0,我有以下输入 xml: 1 不重复 <

回答 0 投票 0

xslt 1.0 从变量中的动态节点集获取数据

正在使用变量存储相关记录信息 变量已更新为根据匹配结果动态选择, 例如 ...

回答 0 投票 0

比较数组中的元素值并获取父元素中的最大值元素

我正在尝试在 1.0 中创建一个 XSLT。请在下面找到一个示例 xml。要求是从所有 3 个字段中获取最大的 value1 字段并显示其中的标签。 请求 XML: 我正在尝试在 1.0 中创建一个 XSLT。请在下面找到一个示例 xml。要求是从所有 3 个字段中获取最大的 value1 字段并显示其中的标签。 请求XML: <?xml version="1.0" encoding="UTF-8"?> <GetTestValues xmlns="http://www.test.com/GetTestValues"> <TestSample> <Test> <value1>10000</value1> <value2>2016-01-28</value2> <value3>2017-12-10T01:36:12.403+00:00</value3> <value4>US</value4> <value5>true</value5> </Test> <Test> <value1>30000</value1> <value2>2019-01-28</value2> <value3>2019-01-28T18:04:13.763+00:00</value3> <value4>Canada</value4> <value5>false</value5> </Test> <Test> <value1>50000</value1> <value2>2019-01-28</value2> <value3>2019-01-28T18:04:13.763+00:00</value3> <value4>Canada</value4> <value5>false</value5> </Test> </TestSample> </GetTestValues> 改造后的预期反应: 请求XML: <?xml version="1.0" encoding="UTF-8"?> <GetTestValues xmlns="http://www.test.com/GetTestValues"> <TestSample> <Test> <value1>50000</value1> <value2>2019-01-28</value2> <value3>2019-01-28T18:04:13.763+00:00</value3> <value4>Canada</value4> <value5>false</value5> </Test> </TestSample> </GetTestValues> 我尝试放置 foreach,它显示了所有内容。不确定如何比较才能获得最大的价值。 <xsl:for-each select="/ns0:GetTestValues/ns0:TestSample/ns0:Test"> <ns0:value1> <xsl:value-of select="ns0:value1"/> </ns0:value1> <ns0:value2> <xsl:value-of select="ns0:value2"/> </ns0:value2> <ns0:value3> <xsl:value-of select="ns0:value3"/> </ns0:value3> <ns0:value4> <xsl:value-of select="ns0:value4"/> </ns0:value4> <ns0:value5> <xsl:value-of select="ns0:value5"/> </ns0:value5> </xsl:for-each> 在此样式表中,我遍历Test 元素集,按其value1 子元素的降序排列(以便第一个Test 元素具有最高的value1)。在 for-each 内部,我检查迭代的当前位置,如果它是 1 ,那么我复制当前的 Test 元素;其他Test元素被忽略。 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:test="http://www.test.com/GetTestValues"> <xsl:output method="xml" indent="yes" /> <!-- identity template --> <xsl:template match="@*|node()" name="identity"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <!-- Select only the Test child whose value1 is greatest --> <xsl:template match="test:TestSample"> <xsl:copy> <!-- iterate over the test child elements, in descending order of value1 --> <xsl:for-each select="test:Test"> <xsl:sort select="test:value1" order="descending"/> <!-- copy the test element if it's the first (has the highest value1) --> <xsl:if test="position()=1"> <xsl:copy-of select="."/> </xsl:if> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

XSLT 版本 1.0 替换 if else

我正在尝试建立一个 XSLT 逻辑,我可以在其中替换考虑到其实际值的值。 我有以下 XML: 我正在尝试建立一个 XSLT 逻辑,我可以在其中替换考虑到其实际值的值。 我有以下 XML: <?xml version="1.0" encoding="UTF-8"?> <DOC BEGIN="1"> <BESKZ>X</BESKZ> <NUM1>1010</NUM1> <NAME>ABC</NAME> </DOC> 现在我想在 XSLT 版本 1 中应用以下逻辑: IF value of BESKZ is "X" replace value with "NS_CFS" ELIF value of BESKZ is "E" replace value with "INV_CFS" ELIF value of BESZK is anything else do noting 和 IF value of NAME is set to anything (not null) replace value with "SERIAL" 所以上面的例子应该是这个输出: <?xml version="1.0" encoding="UTF-8"?> <DOC BEGIN="1"> <BESKZ>NS_CFS</BESKZ> <NUM1>1010</NUM1> <NAME>SERIAL</NAME> </DOC> 我是 xslt 的新手,有人可以帮助我吗? 在 XSLT 中,通常使用一组独立的模板来解决此类问题,每个模板都与您要处理的一种情况相匹配。将这些模板与一个“身份模板”相结合,该模板只复制未更改的内容,您就有了一个解决方案。例如 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- identity template copies any node which isn't handled by a more specific template --> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <!-- templates for handling specific cases --> <!-- IF value of BESKZ is "X" replace value with "NS_CFS" --> <xsl:template match="BESKZ/text()[.='X']">NS_CFS</xsl:template> <!-- ELIF value of BESKZ is "E" replace value with "INV_CFS" --> <xsl:template match="BESKZ/text()[.='E']">INV_CFS</xsl:template> <!-- IF value of NAME is set to anything (not null) replace value with "SERIAL" --> <xsl:template match="NAME/text()">SERIAL</xsl:template> </xsl:stylesheet> 这些模板匹配包含在某些元素中的文本节点(这就是表达式text()所匹配的),因此它们不需要创建或复制元素节点;他们只需要生成一个新的文本节点来替换他们匹配的那个。 请注意,特定模板将匹配那些文本节点,即使通用模板也会匹配它们;那是因为特定模板比通用模板具有更高的“优先级”。可以使用模板的 priority 属性显式设置模板的优先级,但通常您不需要这样做,因为如果您不设置显式优先级,它会由 XSLT 处理器根据模板的 select 表达式:基本上更复杂的 select 表达式将产生更高的优先级。有关详细信息,请参阅 XSLT 的5.5 模板规则冲突解决部分

回答 1 投票 0

在 XSLT 中,我们如何添加 if 条件来检查对象的属性是否具有点 (.) 值 [重复]

在 XSLT 中,我们如何添加 if 条件来检查对象的该属性是否具有点 (.) 值。 示例:当 Students.id 包含点 (.) 值时。那么它将需要Master Id。我们如何...

回答 0 投票 0

在 XSLT 中,我们如何添加 if 条件来检查对象的该属性是否具有点 (.) 值。请有人帮助我

在 XSLT 中,我们如何添加 if 条件来检查对象的该属性是否具有点 (.) 值。请有人帮助我。 示例 - 当 Students.id 包含点 (.) 值时。 ...

回答 0 投票 0

尝试在 Eclipse 中使用 Saxon11 调试 xslt 时出现错误“Provider net.sf.saxon.TransformerFactoryImpl not found”

在 Eclipse 中尝试使用 Saxon11 处理器调试 xslt 文件时: 我收到此错误: 11:28:10,099 信息 [1] 主要 - 启动文件:C:\Users\someuser\myworkspace\.metadata\.plugins\org.

回答 0 投票 0

使用XSLT复制XML中的所有节点,同时转换具有特定兄弟值的节点

我有一个 xml 文件,除了 1 个具有我需要转换的特定值的节点外,我主要需要 1 个复制 1 个。我的 XML 如下所示: 我有一个 xml 文件,除了需要转换的具有特定值的 1 个节点外,我主要需要 1 个复制 1 个。我的 XML 看起来像这样: <?xml version='1.0' encoding='UTF-8'?> <xyz:Workers xmlns:xyz="urn:com.website/xyz"> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isAdded="1"> <xyz:Identifier> <xyz:ID>MJ 12 34 56 Z</xyz:ID> <xyz:IdType>A Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isUpdated="1"> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>JHQ123</xyz:ID> <xyz:IdType>B Type</xyz:IdType> </xyz:Identifier> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> </xyz:Workers> 我需要获取加载到节点xyz:ID中的值 <xyz:ID>MJ 12 34 56 Z</xyz:ID> 然后去掉空白,看起来像这样: <xyz:ID>MJ123456Z</xyz:ID> 但只有当他们的兄弟节点是xyz:IdType = A Type <xyz:IdType>A Type</xyz:IdType> 这是我试过的 XSLT。我引用了这个堆栈溢出(Using XSLT to copy all nodes in XML, with support for special cases)但是在处理它之后,我不确定这是否是正确的方法。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xyz="urn:com.website/xyz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xs this"> <!--Identity template, provides default behavior that copies all content into the output --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="xyz:ID"> <xsl:copy> <xsl:value-of select="translate(node(), ' ', '')"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 这个 XSLT 给我以下输出: <?xml version="1.0" encoding="UTF-8"?><xyz:Workers xmlns:xyz="urn:com.website/xyz"> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isAdded="1"> <xyz:Identifier> <xyz:ID>MJ123456Z</xyz:ID> <xyz:IdType>A Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isUpdated="1"> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>JHQ123</xyz:ID> <xyz:IdType>B Type</xyz:IdType> </xyz:Identifier> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> </xyz:Workers> 这接近于所需的输出,因为它确实从所需的 ID 中去除了空白: <xyz:ID>MJ123456Z</xyz:ID> 但是,在 C 类型标识符上,它正在删除标签中加载的数据: 改造前: <xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> 改造后: <xyz:ID>123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> 这是一个问题,因为我希望文件的其余部分相同,除了 ID 的同级 ID 类型 = A 类型。 我相信这与将自身应用于所有 ID 节点的模板匹配有关。我试着按照这个逻辑做一些事情: <xsl:template match="xyz:Identifier[xyz:IdType='A Type']"> 但是没有运气。任何关于从哪里开始或我应该使用哪种逻辑的线索都将受到高度赞赏。 但只有当他们的兄弟节点是xyz:ID_Type = A Type 为此,您可以在 xyz:Identifier 上使用谓词。请注意,尽管您说的是xyz:ID_Type,但示例中有xyz:IdType. 我也只是匹配text()所以你不必复制或应用模板到xyz:ID的属性。 尝试将您的最后一个模板更改为(如果您的实际数据需要,将 IdType 更改为 ID_Type): <xsl:template match="xyz:Identifier[xyz:IdType='A Type']/xyz:ID/text()"> <xsl:value-of select="translate(., ' ', '')"/> </xsl:template> 小提琴:http://xsltfiddle.liberty-development.net/nbUWwbs 请尝试以下 XSLT。 看来你的 XML 样本应该有而不是: <xyz:IdType>A Type</xyz:IdType> 以下内容: <xyz:ID_Type>A Type</xyz:ID_Type> XSLT <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xyz="urn:com.website/xyz"> <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/> <xsl:strip-space elements="*"/> <!--Identity Transform pattern--> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="xyz:ID[following-sibling::xyz:ID_Type='A Type']"> <xsl:copy> <xsl:value-of select="translate(., ' ', '')"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 输出 <?xml version='1.0' encoding='utf-8' ?> <xyz:Workers xmlns:xyz="urn:com.website/xyz"> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isAdded="1"> <xyz:Identifier> <xyz:ID>MJ123456Z</xyz:ID> <xyz:ID_Type>A Type</xyz:ID_Type> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isUpdated="1"> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>JHQ123</xyz:ID> <xyz:ID_Type>B Type</xyz:ID_Type> </xyz:Identifier> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID> <xyz:ID_Type>C Type</xyz:ID_Type> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> </xyz:Workers>

回答 2 投票 0

当有多个链接标签时获取具有特定rel的链接标签的xsl value-of href属性

我有一个 xml 文件,它有多个名为 tag1 的标签,每个条目标签都有多个链接标签,我需要链接标签的 href,其 rel="x" 1...

回答 0 投票 0

使用过滤器将 XML 转换为 CSV

我有一个 xml 和一个将 xml 转换为 csv 的 XSLT。这里 headerFieldsMap 是 csv 的头部,psPositions 是数据。 XML 版本为 1.0 我需要对 xslt 进行更改,以便

回答 0 投票 0

Xpath 用于查找存在于两个不同自闭合标签中的元素

我正确的 XML 是: XXX .. .. AAA &...

回答 2 投票 0

XSLT 1.3:如何在下面给定的 XML 中读取 Roll no = 493 的行位置。假设卷号是唯一的。我的预期结果是 2

本页中的 Student.xml https://www.tutorialspoint.com/xslt/xslt_choose.htm 即 本页给出 Student.xml https://www.tutorialspoint.com/xslt/xslt_choose.htm i.e <?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class> 如何使用 XSLT 在下面给定的 XML 中读取 Roll no = 493 的行位置。假设卷号是唯一的。在这个例子中,我的预期结果是 2。 Ps:我的XSL:version是1.3。 XSLT 是在 SAP ABAP 环境中编码的。

回答 0 投票 0

XSLT:如何在下面给定的 XML 中读取 Roll no = 493 的行位置。假设卷号是唯一的。在下面的示例中,我的预期结果是 2 [关闭]

本页给出Student.xml https://www.tutorialspoint.com/xslt/xslt_choose.htm 即 本页给出Student.xml https://www.tutorialspoint.com/xslt/xslt_choose.htm即 <?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class> 如何使用 XSLT 在下面给定的 XML 中读取 Roll no = 493 的行位置。假设卷号是唯一的。在这个例子中,我的预期结果是 2

回答 0 投票 0

Xslt 1.0 特定子字符串

我有一个这样的字符串,我需要在特定 | 之间获取特定的子字符串。喜欢之间先 |第二 | (5000935)。我为此使用了下面的代码,但我需要更简单的方法来进一步

回答 0 投票 0

使用 XSLT 从 XML 中删除未使用的名称空间

我需要在加载 XML 文件时删除未使用的名称空间。 它可能看起来像这样: bla<...

回答 0 投票 0

在第二个重复问题中选择唯一值- xslt1.0

我有以下示例 XML 数据: 我有以下示例 XML 数据: <?xml version="1.0" encoding="UTF-8"?> <root> <AllOptions Id="123"></AllOptions> <AllOptions Id="456"></AllOptions> <AllOptions Id="789"></AllOptions> <AllOptions Id="789"></AllOptions> <AllOptions Id="101"></AllOptions> <SelectedOptions> <SelectedOption Id="101" Selected="No"></SelectedOption> <SelectedOption Id="789" Selected="Yes"></SelectedOption> <SelectedOption Id="789" Selected="No"></SelectedOption> <SelectedOption Id="123" Selected="No"></SelectedOption> <SelectedOption Id="456" Selected="No"></SelectedOption> </SelectedOptions> </root> 我正在使用仅支持 XSLT1.0 的工具创建这些数据,并且我正在使用一些 XSLFO 和 XSL 转换这些数据。我尝试在下面添加我所拥有的简化版本和一些解释: 首先,我选择<AllOptions>节点; 在这里面,我需要在<SelectedOption>之后做第二个循环,并将@Id节点的<SelectedOption>与@Id的<AllOptions>相匹配;然后只显示一次当前@Selected属性值 <xsl:template name="ShowOptions"> <xsl:for-each select="/root/AllOptions"> <fo:block><xsl:value-of select="@Id"/></fo:block> <xsl:for-each select="../SelectedOptions/SelectedOption[@Id = current()/@Id]"> <fo:block> <xsl:value-of select="@Selected"/> </fo:block> </xsl:for-each> </xsl:for-each> </xsl:template> 使用上面的模板,我从下面获取值。这是不正确的,因为有些节点可以具有相同的@Id,在这个例子中这是@Id=789,@Selected 将被复制。 123 No 456 No 789 Yes No 789 Yes No 101 No 我需要的是显示当前的@Selected值 123 No 456 No 789 Yes 789 No 101 No 非常感谢任何帮助。

回答 0 投票 0

xsl 1.0 应用模板对按嵌套元素名称嵌套的元素求和

给定 has_depth.xml: 给定has_depth.xml: <?xml version="1.0" encoding="UTF-8"?> <root> <page name="Locale" page_type="VIRTUAL"> <datum name="lat"><type name="double" complex='0'/></datum> <datum name="lon"><type name="double" complex='0'/></datum> </page> <page name="how_many_fields_do_i_have" page_type="CONCRETE"> <datum mnemonic="foo"><type name="int32" complex='0'/></datum> <datum mnemonic="foo_locale"><type name="Locale" complex='1'/></datum> </page> </root> 和find_depth.xslt: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="yes"/> <xsl:template match="/root"> <xsl:apply-templates select="//page[@name='how_many_fields_do_i_have']" /> </xsl:template> <xsl:template match="page" > <xsl:message><xsl:value-of select="concat('getting depth for page ',@name)"/></xsl:message> <xsl:variable name="depth"> <!-- ask the Page's first datum for its depth --> <xsl:apply-templates select="./datum[1]" /> </xsl:variable> <xsl:message><xsl:value-of select="concat('It would take ',$depth,' widgets to show this page in a gui')"/></xsl:message> </xsl:template> <xsl:template match="datum[./type[@complex='0']]" > <xsl:message> <xsl:value-of select="concat('matched simpletype:',current()/type/@name,':',@mnemonic)"/></xsl:message> <xsl:variable name="below"> <xsl:choose> <xsl:when test='current()=last()'><xsl:value-of select='0'/></xsl:when> <xsl:otherwise><xsl:apply-templates select="following-sibling::datum"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:message> <xsl:value-of select="concat('depth after simple ',@mnemonic,': ', 1 + $below)"/></xsl:message> <xsl:value-of select='1 + $below'/> </xsl:template> <xsl:template match="datum[./type[@complex='1']]" > <xsl:message> <xsl:value-of select="concat('matched complextype:',./type/@name,':',@mnemonic)"/></xsl:message> <!-- start depth again recursing into the page[type="'VIRTUAL'"] --> <xsl:apply-templates select="//page[@name='./type/@name']" /> <xsl:if test='current()!=last()'> <xsl:apply-templates select="following-sibling::datum"/> </xsl:if> </xsl:template> 我在 bash 命令时得到以下信息:xsltproc find_depth.xslt has_depth.xml getting depth for page how_many_fields_do_i_have matched simpletype:int32:foo matched complextype:Locale:foo_locale depth after simple foo: NaN It would take NaN widgets to show this page in a gui 我期望输出的地方: getting depth for page how_many_fields_do_i_have matched simpletype:int32:foo matched complextype:Locale:foo_locale getting depth for page Locale matched simpletype:double:lat matched simpletype:double:lon depth after simple lon: 1 depth after simple lat: 2 depth after simple foo: 3 It would take 3 widgets to show this page in a gui 当我尝试apply-templates到Locale时,看起来事情变糟了./type/@name在消息语句中的评估也是“Locale”(见输出语句第3行的冒号之间。)但是确保我使用 xmllint --xpath "//page[@name='Locale']" has_depth.xml 进行检查并发现: xmllint --xpath "//page[@name='Locale']" has_depth.xml <page name="Locale" page_type="VIRTUAL"> <datum name="lat"><type name="double" complex="0"/></datum> <datum name="lon"><type name="double" complex="0"/></datum> </page> 如我所料 问题是: 我怎样才能让这个东西像人们期望的那样递归,并将总和视为数字作为回避泡沫?

回答 0 投票 0

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