Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
搜索更优雅的xsl来解析带有可变元素的嵌套xml_Xml_Xslt - Fatal编程技术网

搜索更优雅的xsl来解析带有可变元素的嵌套xml

搜索更优雅的xsl来解析带有可变元素的嵌套xml,xml,xslt,Xml,Xslt,我有一个xml,我想转换成另一个xml 我想做的是定义一个,当为“0110”时,它从获取值。 当没有值时,xml中会缺少完整的元素。 我需要知道元素是否丢失,以便在生成的.xml中创建一个空元素 源xml中可能有多个元素,其中一些或全部包含,而包含“0110”。 在这种情况下,我需要来自相应元素的所有值,它们应该以的形式显示在目标xml中。您的问题非常笼统,可以说您似乎没有什么问题。Stackoverflow并不是真正要求代码审查的地方(比如:“如何才能更优雅地编程呢?”)。正确的地方是这个 但

我有一个xml,我想转换成另一个xml

我想做的是定义一个
,当
为“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">