Заменить текст по позиции? - PullRequest
0 голосов
/ 16 марта 2012

У меня есть следующий XML-файл (на самом деле это файл RDL службы отчетов сервера SQL). Я хочу заменить <Value> в TablixCell на <DataField> в Fields положением. То есть, «date1» и «prod id1» должны быть заменены на «order_date» и «prod_id» соответственно.

Предпочтительно это можно сделать в SQL Server 2008 с использованием XQuery. 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>
                     .....

1 Ответ

1 голос
/ 16 марта 2012

Попробуйте следующее:

<?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>
...