gpt4 book ai didi

xml - XSL :copy-of How to copy some attributes from a node?

转载 作者:行者123 更新时间:2023-12-02 11:45:52 30 4
gpt4 key购买 nike

如何从节点复制一些属性。例如。我只想从节点“Extn”复制“Srno”,“RollNo”,“right”。

<Main>
<SubMainLevel1 material="12" feature="range">
<SubMainLevel2 arg1="abc" arg2="123">
<Item name="hello" desc="one" />
<Detail long="high" short="wide" />
<Extn Srno="12" RollNo="12" weight="12" folds="2" right="Y" left="N" top="T" bottom="V" />
</SubMainLevel2>
<SubMainLevel2 arg1="cyz" arg2="123">
<Item name="hello2" desc="two" />
<Detail long="short" short="wide" />
<Extn Srno="" RollNo="" weight="" folds="1" right="Y" left="N" top="T" bottom="V" />
</SubMainLevel2>
</SubMainLevel1>
</Main>

我使用的Xsl如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*" />
<xsl:template match="/">
<Job>
<xsl:copy-of select="Main/SubMainLevel1/@*[name()='material']" />
<Lines>
<xsl:for-each select="/Main/SubMainLevel1/SubMainLevel2">
<xsl:if test="@arg2 = '123'">
<Line>
<xsl:copy-of select="@*" />
<xsl:copy-of select="node()[name() = 'Item']" />
<xsl:copy-of select="node()[name() = 'Detail']" />
<xsl:copy-of select="node()[name() = 'Extn']" />
</Line>
</xsl:if>
</xsl:for-each>
</Lines>
</Job>
</xsl:template>
</xsl:stylesheet>

这里如何限制节点“Extn”仅使用上述值。

预期输出为

<?xml version="1.0" encoding="UTF-8"?>
<Job material="12">
<Lines>
<Line arg1="abc" arg2="123">
<Item name="hello" desc="one" />
<Detail long="high" short="wide" />
<Extn Srno="12" RollNo="12" right="Y"/>
</Line>
<Line arg1="cyz" arg2="123">
<Item name="hello2" desc="two" />
<Detail long="short" short="wide" />
<Extn Srno="" RollNo="" right="Y"/>
</Line>
</Lines>
</Job>

注意:这与“How not to copy some attributes? ”不同

最佳答案

我认为您可以从使用 identity template 中受益这里

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

这意味着不要写这个......

  <Line>
<xsl:copy-of select="@*" />
<xsl:copy-of select="node()[name() = 'Item']" />
<xsl:copy-of select="node()[name() = 'Detail']" />
<xsl:copy-of select="node()[name() = 'Extn']" />
</Line>

你可以这样写

 <Line>
<xsl:apply-templates select="@*|node()"/>
</Line>

然后,您就拥有了一个与 Extn 匹配的模板,您可以选择所需的属性

<xsl:template match="Extn">
<xsl:copy>
<xsl:apply-templates select="@Srno|@RollNo|@right|node()"/>
</xsl:copy>
</xsl:template>

尝试这个 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*" />
<xsl:output method="xml" indent="yes" />

<xsl:template match="Main">
<Job>
<xsl:copy-of select="SubMainLevel1/@*[name()='material']" />
<Lines>
<xsl:apply-templates select="SubMainLevel1/SubMainLevel2[@arg2 = '123']" />
</Lines>
</Job>
</xsl:template>

<xsl:template match="SubMainLevel2">
<Line>
<xsl:apply-templates select="@*|node()"/>
</Line>
</xsl:template>

<xsl:template match="Extn">
<xsl:copy>
<xsl:apply-templates select="@Srno|@RollNo|@right|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

注意,我在这里使用 SubMainLevel2 上的模板匹配,而不是 xsl:for-each,还要注意如何不需要 xsl: if 作为条件可以作为选择表达式的一部分。

关于xml - XSL :copy-of How to copy some attributes from a node?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861765/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com