c # XDocument: проверить, существует ли конкретное имя узла, если не добавить - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть узел ниже, который нужно добавить в xslt, если он не существует: -

<xsl:template name="URLSpliter">
    <xsl:param name="url" />
    <xsl:variable name="splitURL" select="substring-after($url, '/')" />
    <xsl:if test="contains($splitURL, '/')">
      <!--To call the template recursively-->
      <xsl:call-template name="URLSpliter">
        <xsl:with-param name="url" select="$splitURL" />
      </xsl:call-template>
    </xsl:if>
    <xsl:if test="not(contains($splitURL, '/'))">
      <xsl:value-of select="$splitURL" />
    </xsl:if>
  </xsl:template>

Для этого сначала мне нужно проверить, существует он или нет? -

Iпроверил это через -

IEnumerable<XElement> xElements = from xmlAuthor in doc.Descendants()
                                                      let xElement = xmlAuthor.Element("URLSpliter")
                                                      where xElement != null 
                                                      select xmlAuthor;

                    var IsUrlSplitterExists= xElements.Any();

                    if(IsUrlSplitterExists)
                    {

                    }

1. Я хочу знать, правильно ли это или нет?

Если не существует (element [name = "URLSpliter"]), необходимо добавить.

Как добавить его в качестве первого узла xslt?

1 Ответ

0 голосов
/ 11 февраля 2019

Чтобы выбрать такие элементы в пространстве имен XSLT с помощью LINQ to XML, вы должны использовать

XNamespace xsl = "http://www.w3.org/1999/XSL/Transform"; 
if (!doc.Root.Elements(xsl + "template").Where(t => (string)t.Attribute("name") == "URLSplitter").Any()) { 
  doc.Root.AddFirst(new XElement(xsl + "template", new XAttribute("name", "URLSplitter"), ...)) 
}

Конечно, поскольку XSLT является XML, вы также можете использовать XSLT для манипулирования вашим XSLT:

<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:axsl="http://www.w3.org/1999/XSL/Transform-alias"
  exclude-result-prefixes="axsl"
  version="1.0">

  <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

  <xsl:output indent="yes"/>

  <xsl:param name="new-template">
   <axsl:template name="URLSpliter">
    <axsl:param name="url" />
    <axsl:variable name="splitURL" select="substring-after($url, '/')" />
    <axsl:if test="contains($splitURL, '/')">
      <!--To call the template recursively-->
      <axsl:call-template name="URLSpliter">
        <axsl:with-param name="url" select="$splitURL" />
      </axsl:call-template>
    </axsl:if>
    <axsl:if test="not(contains($splitURL, '/'))">
      <axsl:value-of select="$splitURL" />
    </axsl:if>
  </axsl:template>
 </xsl:param>

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

  <xsl:template match="xsl:transform[not(xsl:template[@name = 'URLSplitter'])] | xsl:stylesheet[not(xsl:template[@name = 'URLSplitter'])]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:copy-of select="$new-template"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 94rmq5T

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...