Как преобразовать атрибут XML-файла только с помощью XSLT и оставить другой контент? - PullRequest
0 голосов
/ 20 июля 2010

У меня есть XML-файл, как показано ниже, и теперь я хочу использовать XSLT для его преобразования, сохранить все элементы и атрибуты, но если это произойдет с атрибутами, значения которых начинаются с «SQL:», затем выполните командуsql и замените значение атрибута на разрешенный SQL (он включает http://msdn.microsoft.com/en-us/library/533texsx(VS.90).aspx.. Теперь я решил вопрос: как проверить, является ли текущий тип узла атрибутом, и как заменить значение атрибута, я основываюсь на визуальномшаблон студии по умолчанию, как показано ниже:

пример XML-файла (в действительности много элементов):

<DM>
  <DV  id="SQL:Select something from db">
    <Sample aid="SQL:Select something from db">

    </Sample>
  </DV>
  <DV  id="SQL:Select something from db">
    <Sample aid="SQL:Select something from db">
    </Sample>
  </DV>
</DM>

default xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
               xmlns:ms="urn:schemas-microsoft-com:xslt" >
  <xsl:output method="xml" indent="yes"/>

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

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Эта таблица стилей:

<xsl:stylesheet version="1.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="@*[starts-with(translate(substring(.,1,4),'sql','SQL'),'SQL:')]">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="'From SQL!'"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Результат:

<DM>
    <DV id="From SQL!">
        <Sample aid="From SQL!"></Sample>
    </DV>
    <DV id="From SQL!">
        <Sample aid="From SQL!"></Sample>
    </DV>
</DM>

Примечание : не нужно прерывать «преобразование личности». Добавьте атрибуты к результирующему дереву с помощью xsl:attribute.

1 голос
/ 20 июля 2010

Ну, вы используете один шаблон для сопоставления как узлов, так и атрибутов.Было бы легче различить их с помощью двух отдельных шаблонов:

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

<!-- Another template for attributes -->
<xsl:template match="@*">
  <!-- Special case for SQL attributes goes here -->
</xsl:template>

Чтобы определить, начинается ли строка с определенной подстроки, вам нужно использовать start-with () функция.Вы можете использовать это так:

<xsl:if test="starts-with(.,'SQL:')">
  <!-- The current node starts with "SQL:" -->
</xsl:if>
...