0

我经常从这里获得各种技术的帮助。虽然是第一次问问题。最近开始在工作场所使用 XML 技术。卡在一个关键点上。实际上,我正在使用 XSLT 1.0 进行 XML 到 XML 的转换。我遇到了以下问题。

输入 xml 如下所示:

<front>
<funding-group>
<award-group id="award1">
<funding-source id="GS1">A</funding-source>
<award-id rid="GS1">1</award-id>
</award-group>
<award-group id="award2">
<funding-source id="GS2">B</funding-source>
<funding-source id="GS3">C</funding-source>
<award-id rid="GS2 GS3">2</award-id>
</award-group>
</funding-group>
</front>

<body>
<p>This work was supported by the 9 Program Grant 1, A 309 and 311, and B, C Grant 2.</p>
</body>

我需要将其转换为以下内容(注意:funding-source 变为grant-sponsor,award-id 变为grant-num 并且“funding-group”已被删除):

输出xml:

<body>
<p>This work was supported by the 9 Program Grant <grant-num>1</grant-num>, <grant-sponsor>A</grant-sponsor> 309 and 311, and the <grant-sponsor>B</grant-sponsor>, <grant-sponsor>C</grant-sponsor> Grant <grant-num>2</grant-num>.</p>
</body>

尝试使用字符串替换和正则表达式,但无法完全成功。真的需要帮助的家伙.. 任何形式的帮助将不胜感激。谢谢。

4

1 回答 1

0

下面是一个 XSLT 2.0 示例,可以使用 Saxon 9 或 AltovaXML 或 XmlPrime 等 XSLT 2.0 处理器运行:

<xsl:stylesheet
    version="2.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="funding-group"/>

<xsl:template match="body/p//text()">
  <xsl:variable name="pattern1" select="string-join(//award-id, '|')"/>
  <xsl:variable name="pattern2" select="string-join(//funding-source, '|')"/>

  <xsl:analyze-string select="." regex="(^|\s|[,.!?])({$pattern1})($|\s|[,.!?])">
    <xsl:matching-substring>
      <xsl:value-of select="regex-group(1)"/>
      <grant-num><xsl:value-of select="regex-group(2)"/></grant-num>
      <xsl:value-of select="regex-group(3)"/>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
      <xsl:analyze-string select="." regex="(^|\s|[,.!?])({$pattern2})($|\s|[,.!?])">
        <xsl:matching-substring>
          <xsl:value-of select="regex-group(1)"/>
          <grant-sponsor><xsl:value-of select="regex-group(2)"/></grant-sponsor>
          <xsl:value-of select="regex-group(3)"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
          <xsl:value-of select="."/>
        </xsl:non-matching-substring>
      </xsl:analyze-string>
    </xsl:non-matching-substring>
  </xsl:analyze-string>
</xsl:template>

</xsl:stylesheet>

它转换输入

<root>

<front>
<funding-group>
<award-group id="award1">
<funding-source id="GS1">A</funding-source>
<award-id rid="GS1">1</award-id>
</award-group>
<award-group id="award2">
<funding-source id="GS2">B</funding-source>
<funding-source id="GS3">C</funding-source>
<award-id rid="GS2 GS3">2</award-id>
</award-group>
</funding-group>
</front>

<body>
<p>This work was supported by the 9 Program Grant 1, A 309 and 311, and B, C Grant 2.</p>
</body>

</root>

进入结果

<root>

<front>

</front>

<body>
<p>This work was supported by the 9 Program Grant <grant-num>1</grant-num>, <grant-sponsor>A</grant-sponsor> 309 and 311, and <grant-sponsor>B</grant-sponsor>, <grant-sponsor>C</grant-sponsor> Grant <grant-num>2</grant-num>.</p>
</body>

</root>
于 2013-09-13T10:14:45.053 回答