【问题标题】:how to use xslt (version 1.0) to replace substrings of an xml structure如何使用 xslt(1.0 版)替换 xml 结构的子字符串
【发布时间】:2014-05-13 15:22:36
【问题描述】:

我有一个很大的 xml 文件,其中文件的一部分具有以下结构:

如何使用 XSLT 将 xml 元素中的所有“abc...”替换为“xyz...”?

基本条件是:

  • xml - 1.0 版
  • 没有 EXSLT,没有 Java
  • 仅对节点的子节点进行替换:“base.data.row”
  • 我将使用 C++ 中的 XalanTransformer 进行转换

我现在得到的只是 XSLT 中的身份转换,现在我正在寻找一种方法来替换节点“base.data.row”的子节点的名称。 但我不知道怎么做。

这里是xml:

<?xml version="1.0" encoding="utf-8"?>
<base>
  <data>
    <row type="">
      <abc_dimension />
      <abc_weight />
      <numOf />
      <abcValues>
        <val1 />
        <val2 />
      </abcValues>
      <graph />
    </row>
    <row type="">
      <abc_dimension />
      <abc_weight />
      <numOf />
      <abcValues>
        <val1 />
        <val2 />
      </abcValues>
      <graph />
    </row>
    <row type="">
      <abc_dimension />
      <abc_weight />
      <numOf />
      <abcValues>
        <val1 />
        <val2 />
      </abcValues>
      <graph />
    </row>
  </data>
</base>

我在这里 (http://xslttest.appspot.com/) 尝试了“michael.hor257k”的 xslt,它成功了! 但是当我在 C++ 中将它与 XalanTransformer 一起使用时,它只返回 xml 节点的值。 我使用 XalanTransformer 的方式如下:

XALAN_USING_XERCES( XMLPlatformUtils );
XALAN_USING_XALAN( XalanTransformer );

XMLPlatformUtils::Initialize();
XalanTransformer::initialize();

const char* xmlIn = "origXML.xml";
const char* xslIn = "transformation_template.xslt"; //the xslt of michael.hor257k
const char* xmlOut = "origXMLTransformed-out.xml"; //returns only the values of the xml nodes

XalanTransformer theXalanTransformer;
int a_errNumber = theXalanTransformer.transform( xmlIn, xslIn, xmlOut );               

XalanTransformer::terminate();
XMLPlatformUtils::Terminate();
XalanTransformer::ICUCleanUp();

已修复,好像哪里有错别字。 好像 XalanTransformer 使用了默认的模板规则,这将导致输出整个源文档中的所有文本节点。

【问题讨论】:

  • 考虑将您拥有的 XML 作为代码示例发布,以及该示例所需的输出。您想替换元素或属性名称中的abc,还是替换元素或属性内容中的abc

标签: xml xslt replace xalan


【解决方案1】:

试试:

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

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

<!-- rename -->
<xsl:template match="base/data/row/*[starts-with(name(), 'abc')]">
    <xsl:element name="xyz{substring-after(name(), 'abc')}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

【讨论】:

    【解决方案2】:

    尝试使用以下方式,这可能会对您有所帮助。我尝试通过编写一些示例 xml 和 xsl 来处理元素名称,并且效果很好。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="2.0">
        <xsl:template match="/">
            <xsl:element name="base">
                        <xsl:for-each select="base/data">
                    <xsl:element name="row">
                        <xsl:for-each select="row/*">
                            <xsl:choose>
                                <xsl:when test="starts-with(name(.),'abc')">
                                    <xsl:element name="{concat('pqr', substring-after(name(.), 'abc'))}">
                                        <xsl:value-of select="." />
                                    </xsl:element>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:element name="{name(.)}">
                                        <xsl:value-of select="." />
                                    </xsl:element>
                                </xsl:otherwise>
                            </xsl:choose>
                        </xsl:for-each>
                    </xsl:element>
                </xsl:for-each>
            </xsl:element>
        </xsl:template>
    </xsl:stylesheet>
    

    我尝试使用的示例 xml。

    <base>
      <data>
        <row>
          <type>110</type>
          <abc_dimension>dimension value 1</abc_dimension>
          <abc_weight>weight value 1</abc_weight>
          <nomof>x1</nomof>
        </row>
        <row>
          <type>111</type>
          <abc_dimension>dimension value 2</abc_dimension>
          <abc_weight>weight value 2</abc_weight>
          <nomof>x2</nomof>
        </row>
      </data>
    </base>
    

    谢谢,
    高拉夫

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2012-05-31
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2021-11-09
      相关资源
      最近更新 更多