搜索更优雅的xsl来解析带有可变元素的嵌套xml
我有一个xml,我想转换成另一个xml 我想做的是定义一个搜索更优雅的xsl来解析带有可变元素的嵌套xml,xml,xslt,Xml,Xslt,我有一个xml,我想转换成另一个xml 我想做的是定义一个,当为“0110”时,它从获取值。 当没有值时,xml中会缺少完整的元素。 我需要知道元素是否丢失,以便在生成的.xml中创建一个空元素 源xml中可能有多个元素,其中一些或全部包含,而包含“0110”。 在这种情况下,我需要来自相应元素的所有值,它们应该以的形式显示在目标xml中。您的问题非常笼统,可以说您似乎没有什么问题。Stackoverflow并不是真正要求代码审查的地方(比如:“如何才能更优雅地编程呢?”)。正确的地方是这个 但
,当
为“0110”时,它从
获取值。
当
没有值时,xml中会缺少完整的
元素。
我需要知道元素是否丢失,以便在生成的.xml中创建一个空元素
源xml中可能有多个
元素,其中一些或全部包含
,而
包含“0110”。
在这种情况下,我需要来自相应
元素的所有值,它们应该以的形式显示在目标xml中。您的问题非常笼统,可以说您似乎没有什么问题。Stackoverflow并不是真正要求代码审查的地方(比如:“如何才能更优雅地编程呢?”)。正确的地方是这个
但由于我正在编写,是的,代码中有足够的改进空间
对每一个的误用
for each
(以及一般的循环)是一种过程结构,XSLT初学者经常过度使用它,也就是说,在错误的地方使用它。每个
元素的所有都可以在单独的模板中重写,这是组织样式表的更有效的方法。所有元素名称都是预先静态已知的,循环相对简单
如果与
正如您所注意到的,代码中有许多xsl:if
元素。这也可以通过编写带有谓词的单独模板来实现。例如,以下条件:
<xsl:if test="nummer/text()='0120'">
因为每个
的上下文都是当前节点。写作:
<xsl:for-each select="categorieen">
因为XSLT处理器在这样的比较中隐式地选择元素的文本节点。那么这个,
<xsl:if test="nummer='0120'">
这确实可以做得更优雅一些。通常,所有名称空间都在xsl:stylesheet
元素上声明,然后通过前缀引用:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns2="http://www.competent.nl/gbav/v1">
然后,您可以使用ns2:gbavAntwoord
引用此命名空间中的元素,谢谢您的详细回答!您关于我是xsl初学者的评论是正确的;-)。上周我在这个问题上花了更多的时间,现在我要用一条语句和一个更复杂的xpath来解决这个问题:使用一个变量来创建元素名:'
<xsl:for-each select="current()/categorieen">
<xsl:for-each select="categorieen">
<xsl:if test="nummer/text()='0120'">
<xsl:if test="nummer='0120'">
namespace-uri()='http://www.competent.nl/gbav/v1'
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns2="http://www.competent.nl/gbav/v1">