【问题标题】:Replace text by position?按位置替换文本?
【发布时间】:2012-03-15 22:27:01
【问题描述】:

我有以下 XML 文件(它实际上是 SQL 服务器报告服务 RDL 文件)。我想按位置将TablixCell 中的<Value> 替换为Fields 中的<DataField>。即“order date1”和“prod id1”应分别替换为“order_date”和“prod_id”。

最好可以使用 XQuery 在 SQL Server 2008 中完成。如果没有,Xslt 很好。

  <Fields>
    <Field Name="order_date">
      <DataField>order_date</DataField>
      <rd:TypeName>System.DateTime</rd:TypeName>
    </Field>
    <Field Name="prod_id">
      <DataField>prod_id</DataField>
      <rd:TypeName>System.Int32</rd:TypeName>
    </Field>
    ....
  </Fields>
   ......
      <TablixRows>
            <TablixRow>
              <Height>0.25in</Height>
              <TablixCells>
                <TablixCell>
                     ......
                              <Value>order date1</Value>
                     ......
                </TablixCell>
                <TablixCell>
                     .....
                              <Value>prod id1</Value>
                     .....

【问题讨论】:

  • 你能解释更多关于你想要完成的事情吗?我最初的想法是您可以在 rdl 文件中查找和替换...但是您尝试使用 XQuery 的事实让我想知道是否有比在这个文件中替换字符串更大的目标。
  • 是的,如果一个 XML 文件中只有几个字段,则查找和替换可以正常工作。但是,这 50 份报告中的每份报告都有数百列。
  • 在提供的 XML 文件摘录中没有“prod_date”。摘录不是格式正确的 XML 文件,甚至不是格式正确的 XML 片段。请编辑并更正。
  • SQL Server 2008 是否支持 XQUF(XQuery 更新工具)扩展?如果是这样,使用 XQuery 的答案应该很简单。
  • 根据您要完成的任务,Reporting Services 矩阵格式可以透视数据以创建任意列。

标签: sql-server xml xslt reporting-services xquery


【解决方案1】:

尝试以下方法:

<?xml version="1.0" encoding="UTF-8"?>
<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:template match="/">
    <xsl:apply-templates/>
</xsl:template>

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

<xsl:template match="TablixCell">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:with-param name="pos" select="position()"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="Value">
    <xsl:param name="pos"/>
    <xsl:copy>
        <xsl:value-of select="//Fields/Field[$pos]/DataField"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

当使用输入 XML 运行时

<?xml version="1.0" encoding="UTF-8"?>
<Fields>
    <Field Name="order_date">
        <DataField>order_date</DataField>
        <rd:TypeName>System.DateTime</rd:TypeName>
    </Field>
    <Field Name="prod_id">
        <DataField>prod_id</DataField>
        <rd:TypeName>System.Int32</rd:TypeName>
    </Field>
    <Field Name="xxx_id">
        <DataField>zzz_id</DataField>
        <rd:TypeName>System.String16</rd:TypeName>
    </Field>
    <TablixRows>
        <TablixRow>
            <Height>0.25in</Height>
            <TablixCells>
                <TablixCell>
                    <Value>order date1</Value>
                </TablixCell>
                <TablixCell>
                    <Value>prod id1</Value>
                </TablixCell>
                <TablixCell>
                    <Value>xxx id1</Value>
                </TablixCell>
            </TablixCells>
        </TablixRow>
    </TablixRows>
</Fields>

结果是需要的

<?xml version="1.0" encoding="UTF-8"?>
<Fields>
    <Field Name="order_date">
        <DataField>order_date</DataField>
        <rd:TypeName>System.DateTime</rd:TypeName>
    </Field>
    <Field Name="prod_id">
        <DataField>prod_id</DataField>
        <rd:TypeName>System.Int32</rd:TypeName>
    </Field>
    <Field Name="xxx_id">
        <DataField>zzz_id</DataField>
        <rd:TypeName>System.String16</rd:TypeName>
    </Field>
    <TablixRows>
        <TablixRow>
            <Height>0.25in</Height>
            <TablixCells>
                <TablixCell>
                    <Value>order_date</Value>
                </TablixCell>
                <TablixCell>
                    <Value>prod_id</Value>
                </TablixCell>
                <TablixCell>
                    <Value>zzz_id</Value>
                </TablixCell>
            </TablixCells>
        </TablixRow>
    </TablixRows>
</Fields>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2015-12-15
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多