2012-03-15 3 views
0

У меня есть следующий XML-файл (это файл RDL службы отчетов SQL Server). Я хочу заменить <Value> на TablixCell на <DataField> по адресу Fields. То есть «order 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> 
        ..... 
+0

Можете ли вы объяснить подробнее о чем ты» вы пытаетесь достичь? Моя первоначальная мысль заключается в том, что вы можете просто найти и заменить в файле rdl ... но тот факт, что вы пытаетесь использовать XQuery, заставляет меня задаться вопросом, есть ли более значительная цель, чем замена строк в этом одном файле. – Rose

+0

Да, поиск и замена отлично работают, если в одном файле XML есть только несколько полей. Однако в каждом из 50 отчетов есть сотни столбцов. – ca9163d9

+1

В предоставленном отрывке XML-файла отсутствует «prod_date». Выдержка не является хорошо сформированным XML-файлом и даже не является хорошо сформированным фрагментом XML. Пожалуйста, отредактируйте и исправьте. –

ответ

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> 
Смежные вопросы