0

首先,我不是程序员。

我有一个巨大的 XML 文件,其中的术语描述如下:

<term>
<termId>MANUAL000399</termId>
<termUpdate>Add</termUpdate>
<termName>care</termName>
<termType>Pt</termType>
<termStatus>Active</termStatus>
<termApproval>Approved</termApproval>
<termCreatedDate>20120618T14:38:20</termCreatedDate>
<termCreatedBy>admin</termCreatedBy>
<termModifiedDate>20120618T14:40:41</termModifiedDate>
<termModifiedBy>admin</termModifiedBy>
</term>

在文件中,条款有

<termType>

铂或ND

我希望解决方案适用于两者。我想做的是能够通过,查看 termName 中的单词长度,如果那里的字符少于 5 个,则附加另一个属性,a

<termNote> 

在之后

<termModifiedBy> 

财产:

<term>
<termId>MANUAL000399</termId>
<termUpdate>Add</termUpdate>
<termName>care</termName>
<termType>Pt</termType>
<termStatus>Active</termStatus>
<termApproval>Approved</termApproval>
<termCreatedDate>20120618T14:38:20</termCreatedDate>
<termCreatedBy>admin</termCreatedBy>
<termModifiedDate>20120618T14:40:41</termModifiedDate>
<termModifiedBy>admin</termModifiedBy>
<termNote label="Short">Short</termNote>
</term>

谁能建议最好的方法是什么?我在这里找到了正则表达式,但问题是它们的应用,我发现有人建议 /\b[a-zA-Z]{5,}\b/ 但我不知道如何编写一个脚本来接受这个和如果匹配,则插入 termNote。

4

1 回答 1

0

这种转换可以通过一个简单的 XSLT 样式表来完成。(XSLT 是非程序员经常比程序员更热衷的语言。样式表基本上是一组转换规则:当您看到与 X 匹配的内容时,将其替换为 Y。当然,一旦您掌握了 XSLT,您可以称自己为程序员)。

首先是一些样板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/> <!-- removes whitespace from the input -->
<xsl:output indent="yes"/>      <!-- adds whitespace to the output -->

如果没有更具体的规则,则默认模板规则会复制未更改的内容:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

然后是匹配短期术语的模板规则:

<xsl:template match="term[string-length(termName) &lt; 5]">
  <term>
    <xsl:copy-of select="*"/>
    <termNote label="Short">Short</termNote>
  </term>
</xsl:template>

然后结束:

</xsl:stylesheet>

您应该能够使用任何 XSLT 处理器运行它;有很多可用的。如果没有其他想法,请下载 KernowForSaxon(来自 SourceForge),它是围绕我的 Saxon 处理器的一个非常简单的 GUI 界面。

于 2012-09-11T11:30:19.433 回答