- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
精简版:
任何人都可以在 LINQ to XML for VB 或 XSLT 中建议或提供一个示例,说明如何将一个 XML 元素更改为另一个(无需硬编码所有未更改元素的逐个元素副本)?
背景:
我有一个我认为格式正确的 XML 文件,其中包含一个根条目 <collection
> 和多个 <dvd
> 元素。在 DVD 中,有流派和标签,如下所示。 (为简单起见,我删除了许多其他元素)。
我想做的是转任何<Tag
> 可能存在于附加 <Genre
中的元素>.例如,在下面的条目中,我需要添加 <Genre
> child </Genre
>. (我意识到实际上是 TAG 元素的 NAME 属性,我希望将其转换为 GENRE 元素,但如果我什至能弄清楚如何创建一个名为“Tag”的新 GENRE,我会走得更远并且可能会弄清楚其余的。)
我从来没有对 XML 做过任何事情。我的理解是我可以使用 XSLT 转换文件和 XSLCompiledTransform 或者我可以使用 LINQ to XML(我有 Visual Basic 9,并且更喜欢在 VB 中完成所有操作)。 [我相信还有许多其他方法。]
问题是,我找不到任何 XSLT 或 LINQ 语法示例告诉我如何将一个元素转换为另一个元素。我可以写出足够的 LINQ 来一个一个地复制所有元素,但是必须有一种比硬编码所有不变元素的副本更简单的方法! (必须有!)
所以,如果知道的人能给我举个例子,或者给我一些 LINQ 或 XSLT 的入门代码,我将永远感激不尽(好吧,也许不是永远,但至少是很长一段时间!)。
谢谢。
示例 XML:
<Collection>
<DVD>
<ID>0000502461</ID>
<Title>Cirque du Soleil: Alegría</Title>
<Released>2002-05-31</Released>
<RunningTime>90</RunningTime>
<Genres>
<Genre>Family</Genre>
<Genre>Music</Genre>
</Genres>
<Overview>What if anything were possible? What if ...
</Overview>
<Notes/>
<Tags>
<Tag Name="Kids" FullName="Kids"/>
</Tags>
</DVD>
</Collection>
最佳答案
使用最基本和最强大的 XSLT 设计模式之一:覆盖 identity template ,人们将编写这个非常简单的转换来用“主题”元素替换每个“流派”元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Genres"> <Topics> <xsl:apply-templates select="node()|@*"/> </Topics> </xsl:template></xsl:stylesheet>
When applied against the provided source XML document:
<Collection> <DVD> <ID>0000502461</ID> <Title>Cirque du Soleil: Alegría</Title> <Released>2002-05-31</Released> <RunningTime>90</RunningTime> <Genres> <Genre>Family</Genre> <Genre>Music</Genre> </Genres> <Overview>What if anything were possible? What if ... </Overview> <Notes/> <Tags> <Tag Name="Kids" FullName="Kids"/> </Tags> </DVD></Collection>
The wanted result is produced:
<Collection> <DVD> <ID>0000502461</ID> <Title>Cirque du Soleil: Alegría</Title> <Released>2002-05-31</Released> <RunningTime>90</RunningTime> <Topics> <Genre>Family</Genre> <Genre>Music</Genre> </Topics> <Overview>What if anything were possible? What if ... </Overview> <Notes/> <Tags> <Tag Name="Kids" FullName="Kids"/> </Tags> </DVD></Collection>
The first template in the stylesheet is the identity rule. It copies any matched node unchanged and recursively applies templates to its attributes or children. If no other template is present, this template creates identical copy of the source xml document, hence its name.
When there is a more specific template (specifying more specific details for the matched node, such as name and/or other conditions), it is said to "override" the more generic templates. This means that the more specific template is chosen for processing the node.
Using this extremely powerful design pattern it is trivial to implementin just a few lines such processing as:
while copying all other nodes intact.
In our case, the second template is more specific and it gets selected for processing of every element named "Genres". All it does is create an element named "Topics" and inside it apply templates to all of the current node attributes and children.
Finally, the following transformation will add a new "Genre" element to the children of "Genres", for each "Tag" element:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Genres"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> <xsl:apply-templates select="../Tags/Tag" mode="Gen"/> </xsl:copy> </xsl:template> <xsl:template match="Tag" mode="Gen"> <Genre> <xsl:value-of select="@Name"/> </Genre> </xsl:template></xsl:stylesheet>
The result is again as required:
<Collection> <DVD> <ID>0000502461</ID> <Title>Cirque du Soleil: Alegría</Title> <Released>2002-05-31</Released> <RunningTime>90</RunningTime> <Genres> <Genre>Family</Genre> <Genre>Music</Genre>
<Genre>Kids</Genre>
关于xml - 在 Visual Basic 9 中将一个元素转换为另一个元素的 LINQ 或 XSLT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/322496/
我有一个 XSLT 样式表,如下所示: 我想使用第二个 XSLT 样式表来转换此样式表,以删除与 XQHead
我们有一个大型 xslt,可以呈现整个商店区域,包括产品、制造商,并根据价格和类别进行过滤。我使用 sitecore 作为 CMS,但遇到缓存问题。我有大约 9000 个项目,有些页面需要长达 20
我想根据条件的结果应用具有不同参数的模板。像这样: Attribute no. 1
我有一些看起来像这样的 XML Foo Details Bar Details Baz Details Foo Blah Bar BlahBlah Baz BlahBlahBl
我试图从这种输入出发: a b c d e f g ... 使用 XSLT 的 HTML 输出: one two a e b f
我想知道如何在 xslt 中找到特定节点的第一个子节点名称。 我有一个 xml: some text 我可以使用 body/
是否可以在 XSLT 中获取上个月的最后一天?我找到了这个函数:http://www.xsltfunctions.com/xsl/functx_last-day-of-month.html但我不确定如
具有特定节点的匹配元素存在问题。 xml: description of profile PhoneKeyPad S
我将一堆键值对作为参数传递给 XSL(日期 ->“1 月 20 日”,作者 ->“Dominic Rodger”,...)。 我正在解析的一些 XML 中引用了这些 - XML 如下所示: 目前,除
我找不到这个问题的确切答案,所以我希望有人能在这里帮助我。 我有一个字符串,我想在最后一个 '.' 之后获取子字符串。我正在使用 xslt 1.0。 这是怎么做的?这是我的代码。
我在尝试找出 xslt 上的 var 范围时遇到问题。我实际上想要做的是忽略具有重复“旅游代码”的“旅行”标签。 示例 XML: X1 Budapest X1 Budapest X
我有一些数据在 xslt 的 for-each 循环中输出。我对列表进行了分页,但没有对排序选择器进行分页。 用户应该能够对 2 个值(创建的数据和每个项目的数字字段)进行排序。默认的排序方法是创建日
我有一个奇怪的要求。 我在 xslt 中有一个包含月份的变量,带有它们的 id (1-12) 问题是我需要全部显示它们,但从一月(1)以外的月份开始。 目前我有以下 JAN
如何在 xslt 转换中模块化一组重复的输出?例如,我有如下内容(伪代码)。 并
我得到一个像这样的字符串。 13091711111100222222003333330044444400 字符串的模式是这样的 13 - 09 - 17 - 11111 - 100 - 22222 -
我是 XSLT 的新手,有一个一般性问题。为了区分具有不同属性的两个元素,最好(也是为了性能)使用 和 而不是 在一个模板中。据我所知,这就是 XSLT 中应该“思考”的方式。但在我看来,这有一个缺点
如何从“19650512-0065”到“196505120065”这样的字符串中删除连字符 使用这个模板:传递 theID =
是否有任何功能可以在左侧填充零? 我正在尝试做的要求是: 我们不知道即将到来的输入字符串长度。 如果小于 20,我们必须在左侧填充零。 如果输入字符串长度为 10,那么我们必须在左侧填充 10 个零。
身份模板如下所示: 是否选择多于 ,或者身份模板可能是这样的? 当我执行以下操作时,究竟选择了什么? 最佳答案
我正在尝试使用 XML 信息和 XSLT 模板创建超链接。这是 XML 源代码。 Among individual stocks, the top percentage gainers in the
我是一名优秀的程序员,十分优秀!