迭代查找(从列表中)父标签来替换子标签值

迭代查找(从列表中)父标签来替换子标签值

我有一个具有简单标签层次结构的 xml 文件,如下所示:

<Parent Numbrt="X1">
    <Namedchild>Yes</Namedchild>
    ....more children...
<Parent Number="X2">
    <Namedchild>Yes</Namedchild>
    ....more children...
x10000 lines

我需要寻找根据其参数值和代替基于列表(可以是 csv 或其他)的带有 Z 的子标签值,如下所示:

Parent  New-Child-Value
X1      No
X4      No
X5      No
etc

表中约有 800 场比赛。

结果是,源列表中的每个父级在原始 xml 中都以“否”作为子标签值。

我最熟悉的是python

答案1

使用。对于您来说,XSLT-2.0 就足够了。而且它可以从 PHP 执行。

因此,您可以使用以下 XSLT-2.0 代码来实现您的目标。使用名为(如果您使用其他格式,请调整 RegEx) 的
映射文件:a.txt

Parent  New-Child-Value
X1      No
X4      No
X5      No

和此 XSLT-2.0 文件位于同一目录中

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" /> 
  <xsl:output method="xml" indent="yes" /> 
    <xsl:variable name="fileName" select="'a.txt'" />
    <xsl:variable name="csv" select="unparsed-text($fileName)" />
    <xsl:variable name="input" select="tokenize($csv, '\r?\n')[normalize-space()][position() > 1]"/>
    <xsl:variable name="replace">
      <xsl:for-each select="$input">
        <xsl:analyze-string select="." regex='(.+?)\s+(.+)'>
            <xsl:matching-substring>
                <replace>
                    <this><xsl:value-of select="regex-group(1)" /></this>
                    <that><xsl:value-of select="regex-group(2)" /></that>
                </replace>
            </xsl:matching-substring>
            <xsl:non-matching-substring>
                <xsl:message terminate="yes">REPLACEMENT FILE HEADER is not well-formed!</xsl:message>
            </xsl:non-matching-substring>
        </xsl:analyze-string>
      </xsl:for-each>
    </xsl:variable>

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

    <!-- Replace matching values -->
    <xsl:template match="Namedchild[$replace/replace[this = current()/../@Number]]">
        <xsl:copy>
            <xsl:value-of select="$replace/replace[this = current()/../@Number]/that" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

使用此 XML 文件(与示例代码相比,我固定了一个属性值Number并添加了一个元素):root

<root>
    <Parent Number="X1">
        <Namedchild>Yes</Namedchild>
        ....more children...
    </Parent>
    <Parent Number="X2">
        <Namedchild>Yes</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
    <Parent Number="X3">
        <Namedchild>Yes</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
    <Parent Number="X4">
        <Namedchild>Yes</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
    <Parent Number="X5">
        <Namedchild>Yes</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
</root>

其输出(使用 XSLT-2.0 处理器)是:

<root>
   <Parent Number="X1">
      <Namedchild>No</Namedchild>
        ....more children...
    </Parent>
   <Parent Number="X2">
      <Namedchild>Yes</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
   <Parent Number="X3">
      <Namedchild>Yes</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
   <Parent Number="X4">
      <Namedchild>No</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
   <Parent Number="X5">
      <Namedchild>No</Namedchild>
        ....more children...
        x10000 lines
    </Parent>
</root>

这是可行的方法。使用 Python 的 XSLT-2.0 处理器来实现此结果。

这种方式是符合标准并且万无一失的。

相关内容