проблема с совпадением пространства имен в xslt - PullRequest
0 голосов
/ 10 июня 2011

Это проблема с элементами соответствия, которые имеют определенный узел.

xml :

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" herf="B1.xsl"?>
<profile xmlns:base = "urn:mytest:baseInfo"
xmlns:prf="http://www.openmobilealliance.org/tech/profiles/UAPROF/ccppschema-20021212#">
    <base:Description>
        <base:text>description of profile</base:text>
    </base:Description>
    <prf:Component>
        <prf:Keyboard>PhoneKeyPad</prf:Keyboard>
        <prf:Model>SampleModel</prf:Model>
        <prf:NumberOfSoftKeys>3</prf:NumberOfSoftKeys>
        <prf:PixelAspectRatio>1x1</prf:PixelAspectRatio>
        <prf:ScreenSize>128x240</prf:ScreenSize>
    </prf:Component>
</profile>

и XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:base = "urn:mytest:baseInfo" xmlns:prf="http://www.openmobilealliance.org/tech/profiles/UAPROF/ccppschema-20021212#">
<xsl:output method="xml" indent="yes"/>


<xsl:template match="prf:*">
    <xsl:variable name="temp">
        <xsl:value-of select="local-name(.)"/>
    </xsl:variable>

    <xsl:element name="{$temp}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

Результат:

<?xml version="1.0" encoding="UTF-8"?>description of profile<Component>
    <Keyboard>PhoneKeyPad</Keyboard>
    <Model>SampleModel</Model>
    <NumberOfSoftKeys>3</NumberOfSoftKeys>
    <PixelAspectRatio>1x1</PixelAspectRatio>
    <ScreenSize>128x240</ScreenSize>
</Component>

Почему выводится "описание профиля"?Имеет «базовое» пространство имен.

Заранее спасибо.

1 Ответ

3 голосов
/ 10 июня 2011

Простой ответ: потому что вы никогда не говорите процессору XSLT игнорировать его.

Вы предоставляете шаблон, который обрабатывает prf:*, но вы не запрещаете обработку base:. Ничто иное, процессор XSLT применяет поведение по умолчанию ( встроенные правила , также здесь ) к любым узлам, с которыми он сталкивается, которые не обрабатываются никаким пользовательским шаблоном .

Поведение по умолчанию для узлов элементов:

  • скопировать свои дочерние элементы текстового узла в вывод,
  • обрабатывает их дочерние элементы

Зная, что ваши элементы <base:Description> и <base:Text> производят именно то, что вы видите. Чтобы предотвратить это, либо ловите их пустым шаблоном:

<xsl:template match="base:*" /> 

или управляйте потоком программы вручную, определив шаблон для корневого узла:

<xsl:template match="/">
  <xsl:apply-templates select="profile/prf:Component" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...