替换取自另一个 属性 的值
Replace value taken from another property
我正在尝试使用 xmlstarlet 在另一个已经存在的值中复制一个值,但每次都不同,但我找不到方法。这是一个例子:
当前XML:
<MsgList>
<Msg N="/Workflow/StateObject" I="0" T="03 May 2012 09:32:32.795000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:35 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">1</M>
<M N="key-so">357251</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
<Msg N="/Workflow/StateObject" I="0" T="05 Feb 2013 15:26:32.971000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:36 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">2</M>
<M N="key-so">618751</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
</MsgList>
想要XML:
<MsgList>
<Msg N="/Workflow/StateObject" I="0" T="03 May 2012 09:32:32.795000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:35 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">357251</M>
<M N="key-so">357251</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
<Msg N="/Workflow/StateObject" I="0" T="05 Feb 2013 15:26:32.971000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:36 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">618751</M>
<M N="key-so">618751</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
</MsgList>
"key"需要和"key-so"有相同的值;我的 xslt 文件现在是这样的:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:attribute name="xgenkey">
<xsl:text>for pros</xsl:text>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
可以吗?我如何使用此工具来做到这一点?
您的第二个模板实际上应该是 M
元素,它具有 "key"
的 N
属性
<xsl:template match="M[@N='key']">
然后,在模板内部,替换值,可以这样得到新值(其中..
代表父节点)
<xsl:value-of select="../M[@N='key-so']" />
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="M[@N='key']">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="../M[@N='key-so']" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
实际上,您可以通过直接匹配子文本节点来稍微简化它。这也可以工作(假设 M[@N='key']
总是有一个子文本节点)。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="M[@N='key']/text()">
<xsl:value-of select="../../M[@N='key-so']" />
</xsl:template>
</xsl:stylesheet>
我正在尝试使用 xmlstarlet 在另一个已经存在的值中复制一个值,但每次都不同,但我找不到方法。这是一个例子:
当前XML:
<MsgList>
<Msg N="/Workflow/StateObject" I="0" T="03 May 2012 09:32:32.795000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:35 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">1</M>
<M N="key-so">357251</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
<Msg N="/Workflow/StateObject" I="0" T="05 Feb 2013 15:26:32.971000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:36 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">2</M>
<M N="key-so">618751</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
</MsgList>
想要XML:
<MsgList>
<Msg N="/Workflow/StateObject" I="0" T="03 May 2012 09:32:32.795000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:35 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">357251</M>
<M N="key-so">357251</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
<Msg N="/Workflow/StateObject" I="0" T="05 Feb 2013 15:26:32.971000" S="Inquiry" D="Inquiry">
<M N="eventid">999999</M>
<M N="hist-time">19 Oct 2017 10:50:36 Etc/UTC</M>
<M N="hist-user">System</M>
<M N="key">618751</M>
<M N="key-so">618751</M>
<G N="_StateObject">
<F N="CurrentState" T="N">44</F>
<F N="Version" T="S">16.16</F>
<F N="Status" T="S">OK</F>
</G>
</Msg>
</MsgList>
"key"需要和"key-so"有相同的值;我的 xslt 文件现在是这样的:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:attribute name="xgenkey">
<xsl:text>for pros</xsl:text>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
可以吗?我如何使用此工具来做到这一点?
您的第二个模板实际上应该是 M
元素,它具有 "key"
N
属性
<xsl:template match="M[@N='key']">
然后,在模板内部,替换值,可以这样得到新值(其中..
代表父节点)
<xsl:value-of select="../M[@N='key-so']" />
试试这个 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="M[@N='key']">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="../M[@N='key-so']" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
实际上,您可以通过直接匹配子文本节点来稍微简化它。这也可以工作(假设 M[@N='key']
总是有一个子文本节点)。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="M[@N='key']/text()">
<xsl:value-of select="../../M[@N='key-so']" />
</xsl:template>
</xsl:stylesheet>