Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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
向上移动XML节点的子节点_Xml_Xslt_Command Line Interface - Fatal编程技术网

向上移动XML节点的子节点

向上移动XML节点的子节点,xml,xslt,command-line-interface,Xml,Xslt,Command Line Interface,想象一下,我有一个folling XML文件: 前后 我想把它转换成这样的东西: 前后 换句话说,我想获取某个节点的所有子节点,并按顺序将它们移动到父节点。这类似于执行以下命令:“mv./directory/*。”,但用于xml节点 我想在使用unix命令行工具时这样做。我一直在尝试xmlstarlet,它是一个强大的命令行XML操纵器。我试过做这样的事,但没用 echo“beforemidleafter”| xmlstarlet ed-m”//b/*“…” 更新:XSLT模板很好,因为可以从命

想象一下,我有一个folling XML文件:

前后

我想把它转换成这样的东西:

前后

换句话说,我想获取某个节点的所有子节点,并按顺序将它们移动到父节点。这类似于执行以下命令:“mv./directory/*。”,但用于xml节点

我想在使用unix命令行工具时这样做。我一直在尝试xmlstarlet,它是一个强大的命令行XML操纵器。我试过做这样的事,但没用

echo“beforemidleafter”| xmlstarlet ed-m”//b/*“…”

更新:XSLT模板很好,因为可以从命令行调用它们


我的目标是“从XHTML页面中删除链接”,换句话说,用链接标记的内容替换链接所在的位置。

在XSLT中,您可以编写:

<xsl:template match="a"><a><xsl:apply-templates /></a></xsl:template>

<xsl:template match="a/b"><xsl:value-of select="."/></xsl:template>

你会得到:

<a>beforemiddleafter</a>
前后 因此,如果您想以简单的方式实现这一点,只需创建一个XSL样式表并运行XML文件即可


不过,我意识到这不是您所说的(使用Unix命令行)。我对Unix一无所知,所以也许其他人可以填补空白,例如,一些可以执行上述操作的命令行调用。

在XSLT中,您可以编写:

<xsl:template match="a"><a><xsl:apply-templates /></a></xsl:template>

<xsl:template match="a/b"><xsl:value-of select="."/></xsl:template>

你会得到:

<a>beforemiddleafter</a>
前后 因此,如果您想以简单的方式实现这一点,只需创建一个XSL样式表并运行XML文件即可

不过,我意识到这不是您所说的(使用Unix命令行)。我对Unix一无所知,所以也许其他人可以填补空白,例如一些可以执行上述操作的命令行调用。

示例输入文件(test.xml):

产生:

<?xml version="1.0"?>
<test>
<x>before<y>middle</y>after</x>
<a>beforemiddleafter</a>
<a>beforemiddleafter</a>
<x>before<y>middle</y>after</x>
<a>beforemiddleafter</a>
<embedded>foo<a>beforemiddleafter</a>bar</embedded>
</test>

前后
前后
前后
前后
前后
食物前中后酒吧
样式表中的第一个模板是基本标识转换(只复制整个输入XML文档)。第二个模板专门匹配要“折叠”的元素,只复制标记并插入元素的字符串值(=子节点字符串值的串联)。

示例输入文件(test.xml):

产生:

<?xml version="1.0"?>
<test>
<x>before<y>middle</y>after</x>
<a>beforemiddleafter</a>
<a>beforemiddleafter</a>
<x>before<y>middle</y>after</x>
<a>beforemiddleafter</a>
<embedded>foo<a>beforemiddleafter</a>bar</embedded>
</test>

前后
前后
前后
前后
前后
食物前中后酒吧
样式表中的第一个模板是基本标识转换(只复制整个输入XML文档)。第二个模板专门匹配要“折叠”的元素,只复制标记并插入元素的字符串值(=子节点字符串值的串联)。

您尝试过吗

file.xml

<r>
    <a>start<b>middle</b>end</a>
</r>
输出

<a>startmiddleend</a>
startmiddleend
您试过这个吗

file.xml

<r>
    <a>start<b>middle</b>end</a>
</r>
输出

<a>startmiddleend</a>
startmiddleend

如果您的实际目标是从网页中删除链接,那么您应该使用这样的样式表,它匹配所有XHTML

您希望将其显示为:

<p>Here is some <em>linked</em> text.</p>
这里是一些链接文本

它将处理这样一种情况:链接嵌套在通常的父元素(
元素)和
文本之间的意外元素中


如果您的实际目标是从网页中删除链接,那么您应该使用这样的样式表,它匹配所有XHTML

您希望将其显示为:

<p>Here is some <em>linked</em> text.</p>
这里是一些链接文本

它将处理这样一种情况:链接嵌套在通常的父元素(
元素)和
文本之间的意外元素中

使用xmlstarlet:

xmlstr='<a>before<b>middle</b>after</a>'
updatestr="$(echo "$xmlstr" | xmlstarlet sel -T -t -m "/a/b" -v '../.' -n | sed -n '1{p;q;}')"
echo "$xmlstr" | xmlstarlet ed -u "/a" -v "$updatestr"
xmlstr='beforemidleafter'
updatestr=“$(echo“$xmlstr”| xmlstarlet sel-T-T-m”/a/b“-v'../.-n | sed-n'1{p;q;}”)
echo“$xmlstr”| xmlstarlet ed-u”/a“-v“$updatestr”
使用xmlstarlet:

xmlstr='<a>before<b>middle</b>after</a>'
updatestr="$(echo "$xmlstr" | xmlstarlet sel -T -t -m "/a/b" -v '../.' -n | sed -n '1{p;q;}')"
echo "$xmlstr" | xmlstarlet ed -u "/a" -v "$updatestr"
xmlstr='beforemidleafter'
updatestr=“$(echo“$xmlstr”| xmlstarlet sel-T-T-m”/a/b“-v'../.-n | sed-n'1{p;q;}”)
echo“$xmlstr”| xmlstarlet ed-u”/a“-v“$updatestr”

这正是我想要的。谢谢你详细的回答,解释了它是如何工作的。这正是我想要的。谢谢你详细的回答,解释了它是如何工作的