我有一个具有简单标签层次结构的 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 处理器来实现此结果。
这种方式是符合标准并且万无一失的。