protected function _transform($path_src)
    {
        $path = (string)$path_src;

        if (strpos($path, ',') !== false) {
            $paths = explode(',', $path);
            $expressions = [];
            foreach ($paths as $path) {
                $xpath = $this->transform(trim($path));
                if (is_string($xpath)) {
                    $expressions[] = $xpath;
                } elseif (is_array($xpath)) {
                    /** @noinspection SlowArrayOperationsInLoopInspection */
                    $expressions = array_merge($expressions, $xpath);
                }
            }
            return implode('|', $expressions);
        }

        $paths = ['//'];
        $path = preg_replace('|\s+>\s+|', '>', $path);
        $segments = preg_split('/\s+/', $path);
        foreach ($segments as $key => $segment) {
            $pathSegment = static::_tokenize($segment);
            if (0 === $key) {
                if (0 === strpos($pathSegment, '[contains(')) {
                    $paths[0] .= '*' . ltrim($pathSegment, '*');
                } else {
                    $paths[0] .= $pathSegment;
                }
                continue;
            }
            if (0 === strpos($pathSegment, '[contains(')) {
                foreach ($paths as $pathKey => $xpath) {
                    $paths[$pathKey] .= '//*' . ltrim($pathSegment, '*');
                    $paths[] = $xpath . $pathSegment;
                }
            } else {
                foreach ($paths as $pathKey => $xpath) {
                    $paths[$pathKey] .= '//' . $pathSegment;
                }
            }
        }

        if (1 === count($paths)) {
            return $paths[0];
        }
        return implode('|', $paths);
    }
protected function _transform($path_src)
    {
        $path = (string)$path_src;

        if (strpos($path, ',') !== false) {
            $paths = explode(',', $path);
            $expressions = [];
            foreach ($paths as $path) {
                $xpath = $this->transform(trim($path));
                if (is_string($xpath)) {
                    $expressions[] = $xpath;
                } elseif (is_array($xpath)) {
                    /** @noinspection SlowArrayOperationsInLoopInspection */
                    $expressions = array_merge($expressions, $xpath);
                }
            }
            return implode('|', $expressions);
        }

        $paths = ['//'];
        $path = preg_replace('|\s+>\s+|', '>', $path);
        $segments = preg_split('/\s+/', $path);
        foreach ($segments as $key => $segment) {
            $pathSegment = static::_tokenize($segment);
            if (0 === $key) {
                if (0 === strpos($pathSegment, '[contains(')) {
                    $paths[0] .= '*' . ltrim($pathSegment, '*');
                } else {
                    $paths[0] .= $pathSegment;
                }
                continue;
            }
            if (0 === strpos($pathSegment, '[contains(')) {
                foreach ($paths as $pathKey => $xpath) {
                    $paths[$pathKey] .= '//*' . ltrim($pathSegment, '*');
                    $paths[] = $xpath . $pathSegment;
                }
            } else {
                foreach ($paths as $pathKey => $xpath) {
                    $paths[$pathKey] .= '//' . $pathSegment;
                }
            }
        }

        if (1 === count($paths)) {
            return $paths[0];
        }
        return implode('|', $paths);
    }
protected function _transform ( $ path_src ) { $ path = ( string ) $ path_src ; if ( strpos ( $ path , ',' ) !== false ) { $ paths = explode ( ',' , $ path ) ; $ expressions = [ ] ; foreach ( $ paths as $ path ) { $ xpath = $ this -> transform ( trim ( $ path ) ) ; if ( is_string ( $ xpath ) ) { $ expressions [ ] = $ xpath ; } elseif ( is_array ( $ xpath ) ) { /** @noinspection SlowArrayOperationsInLoopInspection */ $ expressions = array_merge ( $ expressions , $ xpath ) ; } } return implode ( '|' , $ expressions ) ; } $ paths = [ '//' ] ; $ path = preg_replace ( '|\s+>\s+|' , '>' , $ path ) ; $ segments = preg_split ( '/\s+/' , $ path ) ; foreach ( $ segments as $ key => $ segment ) { $ pathSegment = static :: _tokenize ( $ segment ) ; if ( 0 === $ key ) { if ( 0 === strpos ( $ pathSegment , '[contains(' ) ) { $ paths [ 0 ] .= '*' . ltrim ( $ pathSegment , '*' ) ; } else { $ paths [ 0 ] .= $ pathSegment ; } continue ; } if ( 0 === strpos ( $ pathSegment , '[contains(' ) ) { foreach ( $ paths as $ pathKey => $ xpath ) { $ paths [ $ pathKey ] .= '//*' . ltrim ( $ pathSegment , '*' ) ; $ paths [ ] = $ xpath . $ pathSegment ; } } else { foreach ( $ paths as $ pathKey => $ xpath ) { $ paths [ $ pathKey ] .= '//' . $ pathSegment ; } } } if ( 1 === count ( $ paths ) ) { return $ paths [ 0 ] ; } return implode ( '|' , $ paths ) ; }
Transform CSS expression to XPath

@param string $path_src

@return string
Transform CSS expression to XPath